2
votes

Faites correspondre tout jusqu'au mot upcase

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


2 commentaires

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


3 Réponses :


1
votes

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"]


0 commentaires

2
votes

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)

Démo RegEx

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

2 commentaires

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



3
votes

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

Démo Regex

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)

Démo Regex


1 commentaires

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