Heim  >  Artikel  >  Backend-Entwicklung  >  Javascript – Eine Frage zu regulären Ausdrücken

Javascript – Eine Frage zu regulären Ausdrücken

WBOY
WBOYOriginal
2016-08-04 09:18:591050Durchsuche

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

Antwortinhalt:

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 zwischen w und W.

  • () identifiziert einen Unterausdruck.

  • (?!) identifiziert eine umgekehrte Lookahead-Behauptung. Im Gegensatz zu Unterausdrücken werden Lookahead-Behauptungen nicht aufgezeichnet.

  • [^] identifiziert den Satz, der die Bedingungen

  • nicht erfüllt

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:

  1. ((?!ph|s).)*

  2. (p[^hs]((?!ph|s).)*)

  3. p

Der gebräuchlichste Ausdruck ist ((?!ph|s).)*Lass es uns analysieren

„The Definitive Guide to JavaScript“ sagt: (?!p) ist eine negative Lookahead-Behauptung mit der Breite Null , die angibt, dass die folgenden Zeichen nicht mit p

übereinstimmen

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).)*/)

  1. 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"

  2. stimmt mit "234" überein und prüft, ob "23" mit ?! übereinstimmt >,"34""23" ."2" entspricht

    . Da
  3. mit
  4. in

    übereinstimmt, endet der Abgleich mit "34""34" ?! "34"

    Das Übereinstimmungsergebnis des gesamten Ausdrucks ist

"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

  1. ((?!ph|s).)*

  2. (p[^hs]((?!ph|s).)*)

  3. p

  4. Der erste Ausdruck bedeutet, dass das längstmögliche Zeichen
    vor
  • oder einem Leerzeichen im Wort gefunden wird

    "ph"Der zweite Ausdruck entspricht den Zeichen im Wort

    und danach. Das erste Zeichen nach
  • darf nicht
  • sein und es darf auch nicht mit

    "p" "p""h" Der dritte Ausdruck stimmt mit einem einzelnen "ph"-Zeichen überein, da die kürzeste passende Form in der vorherigen Übereinstimmung

    ist, was mindestens zwei Zeichen umfasst, und für das Poster ein einzelnes „p“-Zeichen erforderlich ist ist aber nicht im Lieferumfang enthalten, passt also nur auf
  • "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

    darunter geben, der die Anforderungen der Frage
  • vollständig erfüllt
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn