Frage

Ich will eine Liste von Wörtern entsprechen, die leicht genug ist, wenn diese Worte wirklich Worte. Zum Beispiel /\b (pop|push) \b/gsx wenn lief gegen die Zeichenfolge

  

Pop gab einen Stoß die Tür, aber es tauchte zurück

werden die Worte Pop und drücken passen, aber nicht aufgetaucht.

Ich brauche eine ähnliche Funktionalität für Wörter, die Zeichen enthalten, die als Wortgrenzen normalerweise qualifizieren würde. Also brauche ich /\b (reverse!|push) \b/gsx wenn sie gegen die Zeichenfolge lief

  

Push umkehren! umkehren! drücken

, um nur zu umkehren Spiel! und drücken aber nicht überein umkehren! Push. Offensichtlich ist dieser regex tun werden nicht, dass so etwas brauche ich anstelle von \ b verwenden, um meinen regex klug genug zu machen, um diese flippigen Anforderungen zu umgehen?

War es hilfreich?

Lösung

Am Ende eines Wortes bedeutet \ b „das vorherige Zeichen ein Wortzeichen war, und das nächste Zeichen (wenn es ein nächstes Zeichen) ist kein Wortzeichen. Sie wollen die erste Bedingung fallen zu lassen, weil es könnte am Ende des „Wort“ ein nicht-Wortzeichen sein das lässt Sie mit einem negativen Look-Ahead:.

/\b (reverse!|push) (?!\w)/gx

Ich bin mir ziemlich sicher, dass AS3 Regexes Look-Ahead unterstützen.

Andere Tipps

Ihr erstes Problem ist, dass Sie benötigen drei (möglicherweise vier) Fälle, in Ihrem Wechsel, nicht zwei.

  • /\breverse!(?:\s|$)/ umkehren! von selbst
  • /\bpush\b/ Push von selbst
  • /\breverse!push\b/ zusammen
  • /\bpushreverse!(?:\s|$)/ dies ist der mögliche Fall

Ihr zweites Problem ist, dass ein \b nicht nach einem "!" übereinstimmen, da es kein \w ist. Hier ist, was Perl 5 über \b zu sagen hat, können Sie Ihre Dokumente konsultieren, um zu sehen, wenn sie sich einig:

  

eine Wortgrenze ( „\ b“) ist ein Punkt zwischen zwei Zeichen, die ein „\ w“ auf den einer Seite davon und ein „\ W“ auf der anderen Seite davon aufweist (in beliebiger Reihenfolge), das Zählen der imaginäre Buchstaben aus dem Anfang und Ende der Zeichenkette als ein „\ W“ entspricht. (In Zeichenklassen „\ b“ Backspace eher als eine Wortgrenze, so wie es normalerweise der Fall ist in jedem Strings in doppelten Anführungszeichen.)

Also, die Regex, die Sie brauchen, ist so etwas wie

/ \b ( reverse!push | reverse! | push ) (?: \s | \b | $ )+ /gx;

verließ ich die /s, weil es keine Punkte in dieser regex ist, so behandeln, als einzelne Linie macht keinen Sinn. Wenn /s bedeutet nicht behandeln als eine einzige Zeile in Ihrem Motor sollten Sie wahrscheinlich wieder hinzufügen. Außerdem sollten Sie nachlesen, wie Sie Ihren Motor Griffe Wechsel. Ich weiß, in Perl 5, um das richtige Verhalten erhalten Sie müssen die Elemente auf diese Weise ordnen (sonst umkehren! Würden immer über umkehren gewinnen! Drücken).

Sie können \ b durch etwas Gleichwertiges, aber weniger streng ersetzen

/(?<=\s|^)(reverse!|push)(?=\s|$)/g

Auf diese Weise der limitierende Faktor des \b (dass es nur vor oder nach einem tatsächlichen \w Wortzeichen entsprechen kann) entfernt wird.

Jetzt Leerraum oder der Start / Ende der String-Funktion als gültige Separatoren und der innere Ausdruck können leicht zur Laufzeit erstellt werden, aus einer Liste von Suchbegriffen zum Beispiel.

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