Hinweis Über Makeln
Im Wechsel wird jede Alternative an der aktuellen Position in der Zeichenfolge, bis eine der Wechsel überprüft erfolgreich ist oder alle von ihnen versagt .
Fall I
Ihre Saite ist
water watering
Ihre regex ist
/\b(water|watering)\b/g
i) Zunächst einmal wird zunächst Wechsel wie \bwater
geprüft. Es ist erfolgreich und water
ist abgestimmt, weil es ein Leerzeichen nach Wasser in water watering
gibt, das als Endwortgrenze dient.
ii) Aufgrund von g
Flag wird erneut eine Übereinstimmung durchgeführt. Der String watering
wird also versucht, mit \bwater\b
(zusammen mit der Wortgrenze am Ende) übereinzustimmen, aber es schlägt fehl, weil es i
in der Bewässerung nach water
gibt, das nicht Wortgrenze ist. Dann wird der zweite Wechsel überprüft, d. H. \bwatering
, und es ist erfolgreich, weil es ein Ende einer Zeichenkette gibt, die als letzte Wortgrenze für \bwatering\b
dient.
Fall II
Ihre Saite ist
water water-ing
Für regex
/\b(water|water-ing)\b/g
i) Gleich wie Stufe I von Fall I
Jetzt String bis Wasser verbraucht wird und unsere Prüfposition ist Leerzeichen vor w atering
water water-ing
^^
||
ii) ist wieder eine Überprüfung aufgrund g
Flag durchgeführt. Der erste Wechsel wird mit \bwater
versucht. Die Position ist nun -
kurz nach r
und vor i
water water-ing
^^
||
von Zitiert here über Wortgrenze
eine Wortgrenze, in den meisten regex Dialekten, ist eine Position zwischen \ w und \ W (Nicht-Wort-Zeichen) oder am Anfang oder Ende eines Strings, wenn es mit einem Wortzeichen ([0-9A-Za-z_]) beginnt bzw. endet. Der Strich ist kein Wortzeichen.
So -
wirkt als Wortgrenze und \bwater\b
in water-ing
abgestimmt
Fall III
Für regex
/\b(water-ing|water)\b/g
i) Erster alt eration \bwater-ing
ist in der Zeichenkette eingecheckt, stimmt aber nicht mit der Zeichenkette water
überein. Auch hier wird die zweite Alternierung \bwater
überprüft und es ist erfolgreich, weil in der Zeichenfolge ein Leerzeichen nach water
steht.
ii) Erster Wechsel \bwater-ing
wird in der vorhandenen Zeichenfolge geprüft. Die Zeichenfolge endet mit diesem Wort water-ing
. Das Ende der Zeichenfolge ($
) wirkt als Wortgrenze. und Übereinstimmung ist erfolgreich.
Was ist die Lösung?
i) Wenn es wird regex überlappende, halten Sie die längste in Anfahr- und so weiter, wie Sie in Ihrem letzten Lösung verwendet
ii) Sie negative Vorschau verwenden können, wie
\b(water(?!-)|water-ing)\b
Es scheint, Wiktor hat bereits vier Lösungen vorgeschlagen. Sie können alle davon verwenden
Dies geschieht wegen der '-' in' water-ing 'und Wortgrenze '\ b'. – Tushar
Sie können nicht erreichen, was Sie wollen, ohne das erste Zweigmuster neu zu ordnen oder zu ändern. Was ich meine ist: 1) ['/\b(water-ing|water)\b/g'](https://regex101.com/r/pM4mV7/1) oder ['/\ bwater (?: - ing)? \ b/g'] (https://regex101.com/r/pM4mV7/2), oder 2) ['/ \ b (Wasser (?! -) | gießen] \ b/g' ] (https://regex101.com/r/pM4mV7/4). –