2016-06-30 1 views
1

Ich habe Probleme mit einem regulären Ausdruck, der alle Instanzen der angegebenen Wörter abgleicht, aber keine Teilzeichen enthält. Der Text, den ich scanne, ist reiner HTML-Code.Komplexer regulärer Ausdruck, um bestimmte Wörter, aber keine Teilwörter zu erfassen

Hier ist meine aktuelle Regex:

/(|>|^|;|,|)(detroit|to|christmas|holiday|test|his)(<| |\.|;|,|\!|\?|\)|$)/i 

Das regex werden die fett gedruckten Worte entsprechen:

immer Agile installieren Sie die neueste Version von entsprechenden Service und Installationsverfahren! Die in dieser Datenbank enthaltenen Schritte beziehen sich auf Fehlerbehebung, nicht zur Ausführung des Dienstes. Dies ist kein gelenktes Dokument und kann nicht zu nicht Stryker Personal

Weihnachten Urlaub Weihnachten Weihnachten Urlaub ist etwas detroit Weihnachten Urlaub

verteilt werden

Wenn ich die Regex ändern an:

/(|>|^|;|,|)?(detroit|to|christmas|holiday|test|his)(<| |\.|;|,|\!|\?|\)|$)/i 

Der Regex paßt folgende:

immer Agile überprüfen Sie die la Test Version der geltenden Service- und Installationsverfahren! Die in der Datenbank von enthaltenen Schritte dienen nur zur Fehlerbehebung, nicht zur Durchführung von Wartungsarbeiten. T seine ist kein gelenktes Dokument und kann nicht zu nicht-Stryker Personal

Weihnachten, Urlaub, Weihnachten, Weihnachten Urlaub verteilt ist etwas detroitWeihnachten Urlaub

Die zweite Version passt zu allen Wörtern, die es aber wegen der? Modifikator es ist auch passende Teiltöne, die ich überspringen möchte. Wie kann ich die Regex ändern, so dass eine Übereinstimmung von "Weihnachten" den Raum von der nächsten möglichen Übereinstimmung nicht verbessert?

+0

Vielleicht '\ b (detroit | bis | Weihnachten | Urlaub | Test | his) \ b'? Was ist das "Weihnachten", das du versuchst zu erreichen? Auf welcher Sprache/Plattform läuft das? – chris85

Antwort

0

Verwenden Wortgrenze \b, und ich denke, Sie pro Zeile mehr als eine Gruppe passen möchten (g am Ende):

/\b(detroit|to|christmas|holiday|test|his)\b/gi 

https://regex101.com/r/xJ5xW6/1

+0

Schön, danke! – Torporific

0

Sie nicht, was regexp Motor gesagt haben Sie verwenden, aber die übliche Art und Weise zu tun, was Sie brauchen, zPerl, wenn der Motor hat, ist die Null-Breite Wortgrenze Spezifizierer \b:

/(|>|^|;|,|)?\b(detroit|to|christmas|holiday|test|his)\b(<| |\.|;|,|\!|\?|\)|$)/i 

Und zu Ihrer zweiten Frage, die übliche Weise den Motor aus „raubend“ Text zu halten, ist eine „Look-Ahead“ zu verwenden, Spiel (?=...), die den Look-Ahead-regexp erfordert, dort zu sein, ihn aber nicht verbrauchen (so für die spätere Matching verfügbar):

/(|>|^|;|,|)\b(detroit|to|christmas|holiday|test|his)\b(?=<| |\.|;|,|\!|\?|\)|$)/i 
0

Ich denke, das ist das, was Sie suchen:

/\b(detroit|to|christmas|holiday|test|his)+\b/gi 
+1

Nicht ganz: Dies entspricht 'toto' oder' detroitchristmas'. Sie möchten, dass das '+' die '/ b's enthält – TemporalWolf

Verwandte Themen