Expression Régulière Pour Dupliqués Consécutifs Mots
Je suis une expression régulière débutant, et je n'arrive pas à comprendre comment écrire une expression régulière qui doit "correspondre" tous les doublons de mots consécutifs tels que:
Paris en la printemps.
Pas de est liée.
Pourquoi riez-vous? Sont mon expressions régulières mauvais??
Est-il une seule expression régulière qui correspond à TOUS les caractères gras les chaînes ci-dessus?
- Ce n'était pas une "accusation", mais un calme, une question normale qui peut parfaitement prendre un "non" comme réponse. @Joshua: Oui, certaines personnes (pas trop peu) que ce site faire leurs devoirs pour eux. Mais demander les devoirs des questions n'est pas une mauvaise chose à faire, et quand ils sont marqués comme tel. Généralement le style des réponses des changements de "ici est la solution" à "voici certaines des choses que vous n'avez pas pensé", et c'est une bonne chose. Quelqu'un a essayer et maintenir la distinction, dans son cas, c'était moi, et d'ailleurs, "d'autres personnes" faire la même chose. C'est tout.
- L'espoir de voir jamais une question comme "Cela sonne un peu comme un lieu de travail en question. S'agit-il?" et puis les gens diront si débordement de pile est en train de faire le travail de quelqu'un.
- à l'égard de la regex solution que vous avez acceptées, pourriez-vous s'il vous plaît dites-moi comment pourrais-je remplacer les matchs (doublons) par un élément de la paire (par exemple,
not that that is related
->not that is related
)? Merci d'avance - Je crois que j'ai trouvé la solution: je dois remplacer par
\1
! - Cette solution gère consécutives en double mots, quel est le plus générique de la situation: lorsque le nombre de copies de mots est plus grand que 2?, par exemple: "Pas que de est lié".
- Que diriez -
\b(\w+)\s+(\1\s*)+\b
?
Vous devez vous connecter pour publier un commentaire.
Essayer cette expression régulière:
Ici
\b
est une frontière de mot et\1
références capturées match du premier groupe.\0
trop? (Où\0
est l'ensemble de la regex, jusqu'au point actuel OU où\0
se réfère à l'ensemble de la regex)the the-foo bar
. @Daniel réponse est un peu plus correct.and and
devrait devenirand
)?None
re.search
. Voir search() vs match().<p class="bebe">bla bla</p>
comment puis-je intégrer cette regex formule?\b(\w+)\s+\1$
fonctionne dans ces cas, mais ça ne marche pas quand le 2ème mot est pas à la fin d'une ligne. Des idées? [edit] Trouvé le répondre:\b(\w+)\s+\1(?:\s|$)
Je crois que cette expression gère plus de situations:
Une bonne sélection de chaînes de test peuvent être trouvés ici: http://callumacrae.github.com/regex-tuesday/challenge1.html
<strong>\0</strong>
, mais ne fonctionne pas.$1 <strong>$2</strong>
. Mais également utiliser des regex/\b(\S+) (\1)\b/gi
. Voici un lien: callumacrae.github.io/regex-mardi/...<p class="bebe">bla bla</p>
comment puis-je intégrer cette regex formule?Essayez-le avec les dessous de RE
()* Répéter de nouveau
Le plus largement utilisé de la bibliothèque PCRE peut gérer de telles situations (vous ne pourrez pas atteindre la même avec POSIX regex moteurs, tout de même):
\W+
.\b
ne le font pas, parce qu'il ne mange pas tous les caractères.... the these problems...
. Cette solution n'est pas aussi fiable que la structure générale de Gumbo un motif suffisamment implémente les limites des mots.<p class="bebe">bla bla</p>
comment puis-je intégrer cette regex formule?Pas. C'est une irrégularité de la grammaire. Il peut être moteur/spécifique à la langue des expressions régulières que vous pouvez utiliser, mais il n'est pas universel expression régulière qui peut le faire.
C'est la regex que j'utilise pour supprimer les doublons de phrases dans mon twitch bot:
(\S+\s*)
ressemble à une chaîne de caractères qui n'est pas d'espaces, suivi des espaces.\1{2,}
cherche alors plus que 2 occurrences de cette expression dans la chaîne de match. Si il y a 3 phrases qui sont identiques, il correspond.\s*
dans le groupe de capture. Voir cette démonstration: regex101.com/r/JtCdd6/1I said "oioioi" that's some wicked mistressship!
suroioioi
etsss
Ici est un qui attire plusieurs mots à plusieurs reprises:
<p class="bebe">bla bla</p>
comment puis-je intégrer cette regex formule?<p class="bebe">.*?\b\s+(\w+)\b\K\s+\1\s+\b(?=.*?<\/p>)
L'exemple en Javascript: Les Bonnes Parties peuvent être adaptés pour ce faire:
\b utilise \w pour word frontières, où l' \w est équivalente à [0-9A-Z_a-z]. Si vous n'avez pas l'esprit de cette limitation, l'on a accepté la réponse est bien.
Regex pour la Bande 2+ double mots (consécutifs ou non consécutifs mots)
Essayer cette regex qui peut attraper 2 ou plus de doublons, de mots et de ne laisser derrière un seul mot. Et le double de mots n'a même pas besoin d'être consécutives.
Ici,
\b
est utilisé pour la Limite de Mot,?=
est utilisé pour l'anticipation positif, et\1
est utilisé pour le référencement.Exemple
Source
"the cat sat on the mat"
->" cat sat on the mat"
Ci-dessous l'expression doit fonctionner correctement pour trouver n'importe quel nombre de mots consécutifs. La correspondance peut être sensible à la casse.
D'Entrée d'échantillon : au Revoir au revoir au Revoir
Exemple De Sortie : Adieu
Explication:
L'expression regex:
\b : Début d'une frontière de mot
\w+ : n'Importe quel nombre de caractères de mot
(\s+\1\b)* : un nombre Quelconque de l'espace, suivi par le mot qui correspond au mot précédent et se termine à la limite de mot. Tout enveloppé dans * aide à trouver plus d'une des répétitions.
Groupement :
m.groupe(0) : Doit contenir le groupe apparié dans le cas ci-dessus, au Revoir au revoir au Revoir
m.groupe(1) : contient le premier mot du motif correspondant dans le cas ci-dessus au Revoir
Remplacement de la méthode est de remplacer tous consécutives mots correspondants avec la première occurrence du mot.
Cette expression (inspiré de Mike, ci-dessus) semble pour attraper tous les doublons, triplicates, etc, y compris ceux à la fin de la chaîne, que la plupart des autres n'ont pas:
Je sais que la question posée pour correspondre à doublons, mais un triple exemplaire est à seulement 2 doubles uns à côté des autres 🙂
Tout d'abord, j'ai mis
(^|\s+)
pour s'assurer qu'il commence avec un mot complet, sinon, "l'enfant du steak" irait "enfant'steak" (le "s"'s le match). Ensuite, il correspond à tous les mots ((\b\S+\b)
), suivi par un caractère de fin de chaîne ($
) ou d'un nombre de cases (\s+
), le tout répété plus d'une fois.J'ai essayé comme ça et ça a bien fonctionné:
\b
à la fin comme suit:/(^|\s+)(\S+)(($|\s+)\2)+\b/g, "$1$2")
Ce sera ensuite le travail pour des situations de ce genre:the the string String string stringing the the along the the string
deviendrathe string stringing the along the string
Avisstring stringing
. Il obtient assorti avec votre réponse. Je vous remercie.Depuis quelques développeurs sont à venir pour cette page à la recherche d'une solution qui non seulement élimine les doublons consécutifs non-blanc sous-chaînes, mais triplicates et au-delà, je vais vous montrer le modèle adapté.
Modèle:
/(\b\S+)(?:\s+\1\b)+/
(Modèle De Démonstration)Remplacer:
$1
(remplace le fullstring match avec la capture de groupe #1)Ce modèle goulûment correspond à un "tout" non-blanc sous-chaîne, nécessite alors une ou plusieurs copies de la correspondance de sous-chaîne qui peut être délimité par un ou plusieurs caractères espace blanc (espace, tabulation, saut de ligne, etc).
Spécifiquement:
\b
(limite de mot) les personnages sont essentiels pour assurer des mots partiels ne sont pas appariés.+
(un ou plusieurs quantificateur) sur la non-capture d'un groupe est plus approprié que*
parce que*
sera "déranger" le moteur d'expressions régulières pour la capture et la remplacer singleton occurrences -- c'est un gaspillage motif de conception.*remarque si vous travaillez avec des phrases ou des chaînes en entrée avec de la ponctuation, puis le motif devra être affiné.
L'utiliser dans le cas où vous voulez de la casse, la vérification de double mots.