Javascript Regex – Alternative suchen?

Lesezeit: 7 Minuten

Javascript Regex Alternative suchen
Daniel

Hier ist eine Regex, die in den meisten Regex-Implementierungen gut funktioniert:

(?<!filename)\.js$

Dies entspricht .js für eine Zeichenfolge, die mit .js endet, mit Ausnahme von filename.js

Javascript hat kein Regex-Lookbehind. Kann jemand eine alternative Regex zusammenstellen, die das gleiche Ergebnis erzielt und in Javascript funktioniert?

Hier sind einige Gedanken, aber benötigt Hilfsfunktionen. Ich hatte gehofft, es nur mit einer Regex zu erreichen:
http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

  • Wenn Sie nur einen bestimmten Dateinamen oder eine Liste von Dateinamen überprüfen müssen, warum verwenden Sie nicht einfach zwei Überprüfungen? Überprüfen Sie, ob es auf .js endet, und überprüfen Sie dann, ob es nicht mit filename.js übereinstimmt oder umgekehrt.

    – si28719e

    11. September 2011 um 4:10 Uhr

  • Update: Die neueste öffentliche Chrome-Version (v62) enthält (vermutlich experimentelle) Lookbehinds aus der Box: D Beachten Sie jedoch, dass sich Lookbehinds noch in Vorschlagsphase 3 befinden: github.com/tc39/proposal-regexp-lookbehind . Es kann also eine Weile dauern, bis JavaScript überall unterstützt wird. Seien Sie besser vorsichtig bei der Verwendung in der Produktion!

    – Eirik Birkeland

    7. November 2017 um 14:08 Uhr


  • # Update: ES2018 enthält Lookbehind-Behauptungen Plus: – dotAll-Modus (das s-Flag) – Lookbehind-Assertionen – Benannte Capture-Gruppen – Unicode-Eigenschafts-Escapes

    – Ashley Coolman

    26. Januar 2018 um 11:29 Uhr

  • Benutz einfach (?<=thingy)thingy zum positiver Rückblick und (?<!thingy)thingy zum negativer Rückblick. Jetzt unterstützt es sie.

    – Константин Ван

    8. Februar 2018 um 16:51 Uhr

  • @K._ Ab Februar 2018 das ist nicht wahr noch!! Und es wird einige Zeit dauern, da Browser und Engines die Spezifikation (derzeit im Entwurf) implementieren müssen.

    – André Figueiredo

    22. Februar 2018 um 14:23 Uhr

Javascript Regex Alternative suchen
Tim Pietzcker

EDIT: Ab ECMAScript 2018, Lookbehind-Assertionen (sogar unbegrenzt) werden nativ unterstützt.

In früheren Versionen können Sie Folgendes tun:

^(?:(?!filename\.js$).)*\.js$

Dies macht explizit das, was der Lookbehind-Ausdruck implizit macht: Überprüfen Sie jedes Zeichen der Zeichenfolge, wenn der Lookbehind-Ausdruck plus der Regex danach nicht übereinstimmen, und lassen Sie erst dann zu, dass dieses Zeichen übereinstimmt.

^                 # Start of string
(?:               # Try to match the following:
 (?!              # First assert that we can't match the following:
  filename\.js    # filename.js 
  $               # and end-of-string
 )                # End of negative lookahead
 .                # Match any character
)*                # Repeat as needed
\.js              # Match .js
$                 # End of string

Noch eine Bearbeitung:

Es schmerzt mich zu sagen (vor allem, da diese Antwort so positiv bewertet wurde), dass es einen viel einfacheren Weg gibt, dieses Ziel zu erreichen. Es ist nicht nötig, den Lookahead bei jedem Zeichen zu überprüfen:

^(?!.*filename\.js$).*\.js$

funktioniert genauso gut:

^                 # Start of string
(?!               # Assert that we can't match the following:
 .*               # any string, 
  filename\.js    # followed by filename.js
  $               # and end-of-string
)                 # End of negative lookahead
.*                # Match any string
\.js              # Match .js
$                 # End of string

  • Funktioniert in vielen Fällen, außer wenn vorangestellte Zeichen vorhanden sind, zum Beispiel: filename.js (works-nomatch) filename2.js (works-match) blah.js (works – match) 2filename.js (funktioniert nicht – nomatch) — Allerdings hat der Lookbehind die gleiche Einschränkung, die ich bis jetzt nicht erkannt habe …

    – Daniel

    11. September 2011 um 7:40 Uhr


  • @daniel: Nun, deine Regex (mit Lookbehind) stimmt auch nicht überein 2filename.js. Meine Regex passt in genau den gleichen Fällen wie Ihre Beispiel-Regex.

    – Tim Pietzcker

    11. September 2011 um 17:51 Uhr

  • Verzeihen Sie meine Naivität, aber gibt es hier einen Nutzen für die nicht einfangende Gruppe? Ich habe immer gewusst, dass dies nur nützlich ist, wenn versucht wird, eine Rückreferenz zum Ersetzen in einer Zeichenfolge zu ermitteln. Soweit ich weiß, funktioniert dies auch ^(?!filename\.js$).*\.js$

    – Ich möchte Antworten

    28. März 2017 um 6:46 Uhr


  • Nicht ganz, dass Regex nur am Anfang der Zeichenfolge nach “filename.js” sucht. Aber ^(?!.*filename\.js$).*\.js$ würde funktionieren. Versuche, an Situationen zu denken, in denen die NC-Gruppe noch notwendig sein könnte …

    – Tim Pietzcker

    28. März 2017 um 6:53 Uhr

  • Dieser Ansatz lässt sich wie folgt zusammenfassen: Anstatt hinter X zu schauen, nach vorne schauen auf jedes Zeichen, das vor X kommt?

    – Sarsaparille

    29. Juni 2018 um 7:27 Uhr

Javascript Regex Alternative suchen
Benjamin Udink ten Cate

^(?!filename).+\.js funktioniert bei mir

getestet gegen:

  • test.js-Übereinstimmung
  • blabla.js-Übereinstimmung
  • Dateiname.js keine Übereinstimmung

Eine richtige Erklärung für diesen regulären Ausdruck finden Sie unter Regulärer Ausdruck zum Abgleichen einer Zeichenfolge, die kein Wort enthält?

Look ahead ist seit verfügbar Version 1.5 von Javascript und wird von allen gängigen Browsern unterstützt

Aktualisiert Dateiname2.js und 2Dateiname.js entsprechen, aber nicht Dateiname.js

(^(?!filename\.js$).).+\.js

  • Diese Frage, die Sie verlinkt haben, bezieht sich auf ein etwas anderes Problem: das Abgleichen einer Zeichenfolge, die das Zielwort nicht enthält irgendwo. Dieser ist viel einfacher: Er findet eine Zeichenfolge, die dies nicht tut beginnen mit das Zielwort.

    – Alan Moore

    11. September 2011 um 5:50 Uhr

  • Das ist wirklich nett, es vermisst nur Fälle wie: filename2.js oder filenameddk.js oder ähnliches. Dies ist kein Match, sollte aber ein Match sein.

    – Daniel

    11. September 2011 um 7:18 Uhr


  • @daniel Du hast um einen Blick nach hinten gebeten, nicht um einen Blick nach vorne, warum hast du diese Antwort akzeptiert?

    – hek2mgl

    28. Mai 2015 um 8:56 Uhr


  • der angegebene passt nicht auf a.js

    – Inetphantom

    17. März 2016 um 12:35 Uhr


  • Die ursprüngliche Regex mit Lookbehind stimmt nicht überein 2filename.js, aber die hier angegebene Regex tut es. Eine passendere wäre ^(?!.*filename\.js$).*\.js$. Das bedeutet, stimmen Sie mit jedem überein *.js außer *filename.js.

    – weibeld

    16. Mai 2017 um 5:16 Uhr


1646317512 927 Javascript Regex Alternative suchen
Kamil Szot

Angenommen, Sie möchten alle finden int nicht vorangestellt unsigned:

Mit Unterstützung für negatives Look-Behind:

(?<!unsigned )int

Ohne Unterstützung für negatives Look-Behind:

((?!unsigned ).{9}|^.{0,8})int

Grundsätzlich besteht die Idee darin, n vorangehende Zeichen zu erfassen und die Übereinstimmung mit einem negativen Look-Ahead auszuschließen, aber auch die Fälle abzugleichen, in denen keine n vorangehenden Zeichen vorhanden sind. (wobei n die Länge des Look-behind ist).

Also die fragliche Regex:

(?<!filename)\.js$

würde übersetzen in:

((?!filename).{8}|^.{0,7})\.js$

Möglicherweise müssen Sie mit Erfassungsgruppen spielen, um die genaue Stelle der Zeichenfolge zu finden, die Sie interessiert, oder Sie möchten einen bestimmten Teil nicht durch etwas anderes ersetzen.

  • Ich habe das gerade umgerechnet: (?<!barna)(?<!ene)(?<!en)(?<!erne) (?:sin|vår)e?(?:$| (?!egen|egne)) zu (?!barna).(?!erne).(?!ene).(?!en).. (?:sin|vår)e?(?:$| (?!egen|egne)) was für meine Bedürfnisse der Trick ist. Stellen Sie dies nur als ein weiteres “reales” Szenario zur Verfügung. Sehen Verknüpfung

    – Eirik Birkeland

    16. März 2016 um 13:23 Uhr

  • Ich glaube du meintest: ((?!unsigned ).{9}|^.{0,8})int

    – pansay

    4. Februar 2017 um 10:07 Uhr


  • @pansay Ja. Danke. Ich habe meine Antwort gerade korrigiert.

    – Kamil Szot

    13. Februar 2017 um 20:32 Uhr

  • Vielen Dank für die allgemeinere Antwort, die auch dann funktioniert, wenn eine Übereinstimmung tief im Text erforderlich ist (wobei der Anfangsbuchstaben ^ unpraktisch wäre)!

    – Milos Mrdović

    17. August 2017 um 9:28 Uhr

Wenn Sie nach vorne, aber zurück schauen können, könnten Sie die Zeichenfolge zuerst umkehren und dann einen Lookahead durchführen. Natürlich müssen noch einige Arbeiten erledigt werden.

1646317513 208 Javascript Regex Alternative suchen
weibeld

Dies ist eine äquivalente Lösung zu Tim Pietzckers Antwort (siehe auch Kommentare derselben Antwort):

^(?!.*filename\.js$).*\.js$

Es bedeutet, übereinstimmen *.js außer *filename.js.

Um zu dieser Lösung zu gelangen, können Sie prüfen, welche Muster das negative Lookbehind ausschließt, und dann genau diese Muster mit einem negativen Lookahead ausschließen.

Unten ist eine positive Lookbehind-JavaScript-Alternative, die zeigt, wie man den Nachnamen von Personen mit „Michael“ als Vornamen erfasst.

1) Angesichts dieses Textes:

const exampleText = "Michael, how are you? - Cool, how is John Williamns and Michael Jordan? I don't know but Michael Johnson is fine. Michael do you still score points with LeBron James, Michael Green Miller and Michael Wood?";

Holen Sie sich eine Reihe von Nachnamen von Personen mit dem Namen Michael. Das Ergebnis sollte sein: ["Jordan","Johnson","Green","Wood"]

2) Lösung:

function getMichaelLastName2(text) {
  return text
    .match(/(?:Michael )([A-Z][a-z]+)/g)
    .map(person => person.slice(person.indexOf(' ')+1));
}

// or even
    .map(person => person.slice(8)); // since we know the length of "Michael "

3) Lösung prüfen

console.log(JSON.stringify(    getMichaelLastName(exampleText)    ));
// ["Jordan","Johnson","Green","Wood"]

Demo hier: http://codepen.io/PiotrBerebecki/pen/GjwRoo

Sie können es auch ausprobieren, indem Sie das folgende Snippet ausführen.

const inputText = "Michael, how are you? - Cool, how is John Williamns and Michael Jordan? I don't know but Michael Johnson is fine. Michael do you still score points with LeBron James, Michael Green Miller and Michael Wood?";



function getMichaelLastName(text) {
  return text
    .match(/(?:Michael )([A-Z][a-z]+)/g)
    .map(person => person.slice(8));
}

console.log(JSON.stringify(    getMichaelLastName(inputText)    ));

924300cookie-checkJavascript Regex – Alternative suchen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy