Question

J'utilise des emballages de peigne d'octets (http://bytecomb.com/regular-expressions-in-vba/). Ils semblent très bien fonctionner. J'ai besoin d'aide pour formuler des modèles robustes.

Je ressens des résultats inattendus lors de la combinaison de lookahead "(? =)" Avec ou "|".

Input Text String           Pattern                 RxMatch
-----------------           -------                 -------
iraq                q(?!u)                  q
quit                q(?!u)                  0
iraq                q(?=u)                  0
quit                q(?=u)                  q
sta.23.5  .1 words 67.89  ch    \d+\.?\d*|\.\d+(?=\s*ch)            23.5
sta.23.5  .1 words 67.89  ch    (\d+\.?\d*)|(\.\d+)(?=\s*ch)        23.5
sta.23.5  .1 words 67.89  ch    \d+\.?\d*(?=\s*ch)              67.89
sta.23.5  .1 words 67.89  ch    \d+\.?\d*(?=\s*ch)|\.\d+(?=\s*ch)       67.89
sta.23.5  .1 words .89  ch      \d+\.?\d*|\.\d+(?=\s*ch)            23.5
sta.23.5  .1 words .89  ch      (\d+\.?\d*)|(\.\d+)(?=\s*ch)        23.5
sta.23.5  .1 words .89  ch      \d+\.?\d*(?=\s*ch)              89
sta.23.5  .1 words .89  ch      \d+\.?\d*(?=\s*ch)|\.\d+(?=\s*ch)       .89

Le travail "Irak" et "Quit" comme prévu. Pour le prochain ensemble de chaînes de texte d'entrée, j'espère extraire "67.89" et pour le troisième, ".89". Initialement, j'ai formulé d +.? D * |. D + Pour le nombre décimal flottant pour couvrir les deux situations. L'ajout de parenthèses n'a pas aidé. Suppression de la OR a aidé pour 67,89. Enfin, j'ai trouvé une solution de travail. Mais y a-t-il quelque chose de mieux? Pouvez-vous m'aider à comprendre l'ordre de priorité? Si possible, je voudrais garder les deux parties de la OR ensemble.

Merci, non-programmeur!

Était-ce utile?

La solution

\d+\.?\d*|\.\d+(?=\s*ch) Appliqué à "STA.23.5 .1 Mots 67.89 CH" Capture 23.5 d'abord car il correspond \d+\.?\d*

Le ou "|" a la plus haute préséance, si vous voulez y penser comme ça, diviser le motif en deux matchs possibles: \d+\.?\d* et \.\d+(?=\s*ch)

Si vous voulez empêcher \d+\.?d* De la correspondance de 23,5, vous devrez ajouter un critère supplémentaire, comme nécessiter un personnage d'espace avant lui et utiliser la capture de parenthèses pour obtenir le nombre en tant que submatch: \s(\d+\.?\d*)

Vous pourriez correspondre à la fois à ce modèle, \s(\d+\.?\d*)|\.\d+(?=\s*ch), mais gardez à l'esprit que si la première mi-temps correspond, vous regardez les sous-rapports pour la valeur réelle.

Le vrai problème ici est que la classe regexp de VBScript ne prend pas en charge LookBehind, juste lookahead.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top