Frage

Ich benutze Wrapper aus Byte -Kamm (http://bytecomb.com/regular-expression-in-vba/). Sie scheinen sehr gut zu arbeiten. Ich brauche Hilfe, um robuste Muster zu formulieren.

Ich erlebe unerwartete Ergebnisse, wenn ich Lookahead kombiniert "(? =)" Mit oder "|".

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

"Irak" und "aufhören" wie erwartet. Für den nächsten Satz von Eingabetxtzeichene hoffe ich, "67,89" und für die dritte ".89" zu extrahieren. Zunächst formulierte ich d+. D*|. D+ für schwimmende Dezimalzahl, um beide Situationen abzudecken. Das Hinzufügen von Klammern half nicht. Entfernen des oder half für 67,89. Schließlich fand ich eine funktionierende Lösung. Aber gibt es etwas Besseres? Kannst du mir helfen, die Reihenfolge der Vorrang zu verstehen? Wenn möglich, möchte ich die beiden Teile des oder zusammen behalten.

Danke, Not-a-Programmer!

War es hilfreich?

Lösung

\d+\.?\d*|\.\d+(?=\s*ch) angewendet auf "sta.23.5 .1 Wörter 67.89 CH" erfasst 23,5 zuerst, weil es übereinstimmt \d+\.?\d*

Das oder "|" Hat die höchste Vorrang, wenn Sie sich so vorstellen möchten, und das Muster in zwei mögliche Übereinstimmungen aufteilt: \d+\.?\d* und \.\d+(?=\s*ch)

Wenn Sie verhindern möchten \d+\.?d* Ab dem Matching 23.5 müssten Sie zusätzliche Kriterien hinzufügen, z. \s(\d+\.?\d*)

Sie könnten beide mit diesem Muster übereinstimmen, \s(\d+\.?\d*)|\.\d+(?=\s*ch), Aber denken Sie daran, dass Sie, wenn die erste Halbzeit übereinstimmt, die Untermatches für den tatsächlichen Wert betrachten.

Das eigentliche Problem dabei ist, dass die Regexp -Klasse von VBSCIPT LookBehind, nur Lookahead, nicht unterstützt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top