Je veux capturer un mot placé avant un autre qui est entièrement en majuscule
Mister Foo BAR is here # => "Foo" Miss Bar-Barz FOO loves cats # => "Bar-Barz"
J'ai essayé l'expression régulière suivante: (Mister|Miss)\s([[:alpha:]\s\-]+)(?=\s[AZ]+)
, mais parfois cela inclut le reste de la phrase . Par exemple, il retournera Bar-Barz FOO loves cats
au lieu de Bar-Barz
).
Comment puis-je dire, en utilisant RegExp, "faire correspondre tous les mots jusqu'au mot upcase"?
Pour clarifier l'utilisation de l'anticipation négative, pouvons-nous dire qu'il "capture jusqu'à ce que le sous-modèle spécifié corresponde, mais ne l'inclut pas dans les données de correspondance"?
En tant que non anglophone, je m'excuse si ma réponse n'est pas parfaitement formulée. Merci d'avance
3 Réponses :
Vous ne dites pas dans quelle langue vous travaillez, mais ce qui suit fonctionne pour moi. L'idée est de s'arrêter lorsque l'analyseur atteint une séquence de lettres majuscules / traits d'union.
Exemple JS:
let ptn = /(Mister|Miss)\s[\w\-]+(?=\s[A-Z\-]+)/; "Mister Foo BAR is here".match(ptn); //["Mister Foo", "Mister"] "Miss Bar-Barz FOO loves cats".match(ptn); //["Miss Bar-Barz", "Miss"]
Je veux capturer un mot placé avant un autre qui est entièrement en majuscule
Vous pouvez utiliser cette expression régulière avec une anticipation:
\b\S+(?=[ \t]+[A-Z]+\b)Description RegEx:
\b
: Limite de mot\S+
: correspond à 1+ caractères non blancs(?=[ \t]+[AZ]+\b)
: Lookahead positif qui affirme que nous avons 1+ espace, puis un mot contenant uniquement des lettres majuscules
Merci d'illustrer l'utilisation de lockahead, cela m'aide vraiment à comprendre!
La réponse du quatrième oiseau répond également à ma question, bien que votre expression soit plus efficace
Faites correspondre 1+ caractères de mot éventuellement répétés par un -
et 1+ caractères de mot pour ne pas faire correspondre uniquement les traits d'union ou un trait d'union à la fin.
Affirmez un espace suivi de 1+ caractères majuscules et d'une limite de mot à droite.
\w+(?:-\w+)*(?=[^\S\r\n]+[A-Z]+\b)
Explication
\w+
Correspondre au caractère 1+ mot(?:-\w+)*
Répéter éventuellement la correspondance -
et 1+ mots de caractères(?=\s[AZ]+\b)
Recherche positive, affirmer que ce qui est directement à droite est 1+ caractères majuscules AZ suivis d'une limite de mot S'il ne peut y avoir aucune nouvelle ligne entre les mots, vous pouvez utiliser [^\S\r\n]
au lieu de \s
\w+(?:-\w+)*(?=\s[A-Z]+\b)
Merci pour votre réponse, comme celle d'Anubhava, une utilisation pratique de lockahead était exactement ce dont j'avais besoin pour comprendre comment ils fonctionnent
Pouvez-vous confirmer qu'il n'y aura pas de personnes nommées comme "Miss Foo B Bar ETC etc"? Ou ce que j'essaye de dire; le mot majuscule serait-il toujours de 2 lettres ou plus?
Vous avez raison, chaque nom de famille est composé d'au moins 4 caractères majuscules. Cependant, certains peuvent contenir des traits d'union, comme
FOO-BAR