2016-08-18 4 views
3

Ich versuche, einen JavaScript-freundlichen regulären Ausdruck zu erstellen, der mit Strings übereinstimmt, die mit einer bestimmten Wortgruppe (A) beginnen und andere Wörter enthalten die Zeichenkette muss entweder innerhalb einer Gruppe von Wörtern (B) oder nicht innerhalb einer Gruppe von Wörtern (C) sein.Regex zum Suchen einer Wortgruppe mit einer optionalen Liste von eingeschlossenen und ausgeschlossenen Wörtern

so dass die folgenden Wortgruppen (A), (B) und (C) angegeben:

(A) Test, Sample 
(B) Good, Stuff 
(C) Hello, World 

und die folgenden Beispiel Saiten gegeben, die mit jedem Wort in (A) beginnen:

Test 
Test Good 
Sample Stuff 
Test Hello 
Sample World 
Test Hello Stuff 
Sample Good World 
Test Other 
Test Other Stuff 
Sample Other World 
Test Other Stuff Other 

die folgenden Strings angepasst würden:

Test 
Test Good 
Sample Stuff 
Test Other Stuff 
Test Other Stuff Other 

Idealer (in diesem Fall "Test" und "Probe") nur die Wörter in der Gruppe A würde durch den Ausdruck verbraucht, und der Rest würde durch positive und negative Lookaheads behandelt werden. Ich kann jedoch auch mit einer Zeichenfolge ganz oder teilweise arbeiten, die mit (A) beginnt, die enthält (B), aber nicht (C) enthält.

Ich habe jetzt einige Tage an diesem Problem gearbeitet, und die nächste Antwort, die ich auf dieser Website bisher ist:

Is there a regex to match a string that contains A but does not contain B

jedoch die Lösung, die dort vorgeschlagen wird, nicht die umfasst Voraussetzung für das Starten von Wörtern, die einzeln abgeglichen werden (wie es in meinem Beispiel mit dem ersten Spiel "Test" der Fall ist).

Der nächstgelegene ich zu einer Lösung gekommen sind, ist der folgende Ausdruck:

Sehen Sie hier für ein funktionierendes Beispiel:

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

Dies gilt jedoch nicht einzelne Instanzen von Wörtern entsprechen in (A) (zB "Test") und Wörter in (C) übereinstimmen, wenn sie vor Wörtern in (B) vorkommen (zB "Sample World Good").

Ich hoffe, dass das Sinn macht, aber lass es mich wissen, wenn ich noch etwas klären kann. Ich wäre sehr dankbar für jede Hilfe oder Hinweise in die richtige Richtung.

Antwort

1

Im Anschluss an Geo's große Antwort, habe ich heute Es gelang ihm, seinen angegebenen Ausdruck leicht zu refaktorieren von:

(?=(^(?!.*(Hello|World)).*))(^(Test|Sample)$|^(Test|Sample).*(?=(Good|Stuff)).*$) 

An:

(?=(^(?!.*(Hello|World)).*))^(Test|Sample)($|.*(?=(Good|Stuff)).*$) 

eine Arbeitsversion here sehen.

Diese Version entfernt die Notwendigkeit für die zwei Vorkommen von Zeichenfolge Startwörter (Gruppe A Wörter) im Ausdruck. Ansonsten funktioniert der Ausdruck in der gleichen Weise, wie Geo in seiner Antwort erklärt hat.

Hoffentlich wird dies jemand anderem helfen.

2

Ich hoffe, dass ich es richtig verstanden, aber ich glaube, Sie suchen

^(Test|Sample)(?!.*(Hello|World))(?=$|.*(Stuff|Other)).* 

Testen Sie live on regex101.com.

Erläuterung:

^      # Start of string 
(Test|Sample)   # Match Test or Sample 
(?!.*(Hello|World)) # Assert that neither Hello nor World are in the string 
(?=$|.*(Stuff|Other)) # Assert that the string is over here or that Stuff/Other follows 
.*     # Match rest of string 
+0

Das sieht ziemlich gut aus, aber es wird etwas wie "Test Word Stuff" übereinstimmen. Die Anforderungen sehen jedoch etwas verwirrend aus. C klingt bei B redundant. – NullUserException

+0

Ahh, ich dachte, andere Wörter wären erlaubt (weil, wie du geschrieben hast, warum brauchen wir dann eine Liste verbotener Wörter?), Aber vielleicht sind sie es auch nicht. Das würde die Regex viel einfacher machen. –

0

versuchen

(?=(^(?!.*(Hello|World)).*))(^(Test|Sample)$|^(Test|Sample).*(?=(Good|Stuff)).*$) 

es hier zu sehen arbeiten: https://regex101.com/r/qX2xS6/2

Eine kurze Erklärung:

zuerst alle Hello|World ausschließen
dann _ mit den passenden Strings (bis jetzt) ​​ _ machen die restlichen Übereinstimmungen.

Rest Spiele:
Einstimmungsleitungen mit nur einem Wort: Test|Sample
- oder -
Einstimmungsleitungen mit Test|Sample beginnen und enthalten Good|Stuff

+0

Vielen Dank, das ist genau das, was ich suchte ... Ich habe nicht gemerkt, dass negative Lookaheads am Anfang so hinzugefügt werden können, und ich hatte nicht in Betracht gezogen, den Ausdruck in zwei Seiten einer OR-Anweisung aufzuteilen. Das Sperren von "Test and Sample" zwischen den Zeichen^und $ ist auch eine gute Möglichkeit, um das einmalige Auftreten dieser Wörter zu erzwingen. Vielen Dank auch an alle anderen für Ihre Kommentare. Ich hoffe, dass dies für jemand anderen zu einem bestimmten Zeitpunkt nützlich ist! –

+0

Danke auch Σωκράτη, να είσαι καλά :) –

+0

Και για σένα φίλε μοου ;-) –

Verwandte Themen