Heim > Artikel > Backend-Entwicklung > Javascript – Eine Frage zu regulären Ausdrücken
Problem: Es gibt eine Zeichenfolge: „python php ruby javascript jsonp mightphpisoutdated“
Verwenden Sie für diese Zeichenfolge einen reinen regulären Ausdruck, um alle Wörter mit p, aber nicht ph zu erhalten
Ausgabearray [ 'python', 'javascript', 'jsonp' ]
Ich habe lange über dieses Problem nachgedacht und ich habe keine Ahnung
Meine Lösung ist
<code>var result = str.match(/\b\w*(?=p)\w*\b/g) .filter((value)=>!/.*(?=ph)/.test(value)) var result2 = str.match( /\b((?!ph|\s).)*((p[^h\s]((?!ph|\s).)*)|p)\b/g ) console.log(result2)</code>
Aber es genügt nicht den Anforderungen der reinen Regelmäßigkeit
Ein großer Typ in der Gruppe gab diese Antwort
<code>/\b((?!ph|\s).)*((p[^h\s]((?!ph|\s).)*)|p)\b/g </code>
Funktioniert perfekt
Aber ich kann es nicht verstehen, ich hoffe, jemand kann mir helfen, es zu verstehen
Problem: Es gibt eine Zeichenfolge: „python php ruby javascript jsonp mightphpisoutdated“
Verwenden Sie für diese Zeichenfolge einen reinen regulären Ausdruck, um alle Wörter mit p, aber nicht ph zu erhalten
Ausgabearray [ 'python', 'javascript', 'jsonp' ]
Ich habe lange über dieses Problem nachgedacht und ich habe keine Ahnung
Meine Lösung ist
<code>var result = str.match(/\b\w*(?=p)\w*\b/g) .filter((value)=>!/.*(?=ph)/.test(value)) var result2 = str.match( /\b((?!ph|\s).)*((p[^h\s]((?!ph|\s).)*)|p)\b/g ) console.log(result2)</code>
Aber es genügt nicht den Anforderungen der reinen Regelmäßigkeit
Ein großer Typ in der Gruppe gab diese Antwort
<code>/\b((?!ph|\s).)*((p[^h\s]((?!ph|\s).)*)|p)\b/g </code>
Funktioniert perfekt
Aber ich kann es nicht verstehen, ich hoffe, jemand kann mir helfen, es zu verstehen
<code>var str = 'python php ruby javascript jsonp perhapsphpisoutdated'; var reg = /\b(\w*(p[^h\s](?!ph))\w*)\b/g; str.match(reg); // => ["python", "javascript", "perhapsphpisoutdated"]</code>
b
ist ein Grenzzeichen und der Bereich umfasst die Zeichen zwischenw
undW
.
()
identifiziert einen Unterausdruck.
(?!)
identifiziert eine umgekehrte Lookahead-Behauptung. Im Gegensatz zu Unterausdrücken werden Lookahead-Behauptungen nicht aufgezeichnet.- nicht erfüllt
[^]
identifiziert den Satz, der die Bedingungen
Die obige reguläre Bedeutung lautet also: Erhalten Sie die Zeichenfolge zwischen den Grenzen, die „p“ enthält, die folgende Zeichenfolge jedoch nicht „h“ oder „Leerzeichen“ ist und nicht gleichzeitig „ph“ enthält
b((?!ph|s).)*((p[^hs]((?!ph|s).)*)|p)b/g
b
ist das Grenzzeichen
Die entsprechende Übereinstimmung für jedes Wort lautet also: ((?!ph|s).)*((p[^hs]((?!ph|s).)*)|p)
Teilen Sie diesen Ausdruck in drei Teile:
((?!ph|s).)*
(p[^hs]((?!ph|s).)*)
p
Der gebräuchlichste Ausdruck ist ((?!ph|s).)*
Lass es uns analysieren
übereinstimmen„The Definitive Guide to JavaScript“ sagt:
(?!p)
ist eine negative Lookahead-Behauptung mit der Breite Null , die angibt, dass die folgenden Zeichen nicht mitp
Die Nullbreite bedeutet hier, dass sie nicht den passenden einnimmt:
Dies ist möglicherweise schwer zu verstehen, zum Beispiel:
Berechnen Sie den Wert von "1234".match(/((?!34).)*/)
Wenn es zum ersten Mal nichts vor (?!34)
gibt, ignorieren Sie es, stimmen Sie nur mit .
überein, stimmen Sie mit "1"
überein, und die verbleibende Zeichenfolge ist "234"
stimmt mit "234"
überein und prüft, ob "23"
mit ?!
übereinstimmt >,"34"
"23"
.
"2"
entspricht
übereinstimmt, endet der Abgleich mit "34"
"34"
?!
"34"
"12"
Schlussfolgerung: Die Zeichenfolge, die mit dem Ausdruck in der Form übereinstimmt, ist der Teil vor
/((?!p).)*/
Hier sehen wir uns die vorherigen drei Ausdrücke an:p
((?!ph|s).)*
(p[^hs]((?!ph|s).)*)
p
"ph"
Der zweite Ausdruck entspricht den Zeichen im Wort
"p"
"p"
"h"
Der dritte Ausdruck stimmt mit einem einzelnen "ph"
-Zeichen überein, da die kürzeste passende Form in der vorherigen Übereinstimmung
"p"
Wenn Sie es durchsehen, werden Sie feststellen, dass keiner der drei oben genannten übereinstimmenden Ausdrücke mit p[^hs]
übereinstimmt, aber es muss einen