Wie werden alle Elemente geloopt, die mit der Regex übereinstimmen?

Lesezeit: 4 Minuten

Hier ist der Fall: Ich möchte die Elemente finden, die mit der Regex übereinstimmen …

targetText = “SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext”

und ich verwende den Regex in Javascript so

reg = new RegExp(/e(.*?)e/g);   
var result = reg.exec(targetText);

und ich bekomme nur den ersten, aber nicht den folgenden…. Ich kann nur den T1 bekommen, aber nicht T2, T3 … …

  • Kann jemand eine For-Schleife vorschlagen?

    – DNB5 Krempe

    3. August 2009 um 12:34 Uhr

Benutzeravatar von chaos
Chaos

var reg = /e(.*?)e/g;
var result;
while((result = reg.exec(targetText)) !== null) {
    doSomethingWith(result);
}

  • Anstatt new RegExp zu verwenden und dann einen regulären Ausdruck einzufügen, tun Sie es einfach reg = /e(.*>)e/g; Die Verwendung des new-Operators ist überflüssig, es sei denn, Sie füttern ihn mit einer Zeichenfolge. Stellen Sie außerdem sicher, dass Sie dies mit dem globalen Flag (/g) kennzeichnen, da Sie sonst in einer Endlosschleife landen können.

    – Frug

    10. April 2014 um 21:07 Uhr

  • Beachten Sie, dass die Regex einem Objekt zugewiesen werden muss, bevor Sie sie auf diese Weise verwenden: /e(.*?)e/.exec(...) ergibt eine Endlosschleife.

    – ARM

    24. Mai 2017 um 18:36 Uhr

  • @RaviParekh: hast du das hinzugefügt /g Modifikator?

    – Chaos

    30. November 2017 um 15:26 Uhr

  • Der Nachwelt zuliebe muss der RegExp außerhalb der While-Schleife deklariert werden; Andernfalls erhalten Sie immer noch eine Endlosschleife.

    – Modular

    13. März 2018 um 16:04 Uhr

  • Sie können den While-Ausdruck auch verkürzen: while(result = reg.exec(targetText)) { die Nutzung der “falschen” Entschlossenheit.

    – Modular

    13. März 2018 um 16:10 Uhr

Benutzeravatar von Modular
Modular

Drei Ansätze, je nachdem, was Sie damit machen möchten:

  • Durchlaufen Sie jedes Spiel: .match

    targetText.match(/e(.*?)e/g).forEach((element) => {
       // Do something with each element
    });
    
  • Durchlaufen und ersetzen Sie jedes Match on the fly: .replace

    const newTargetText = targetText.replace(/e(.*?)e/g, (match, $1) => {
      // Return the replacement leveraging the parameters.
    });
    
  • Schleife durch und mache spontan etwas: .exec

    const regex = /e(.*?)e/g;  // Must be declared outside the while expression, 
                               // and must include the global "g" flag.
    
    let result;
    while(result = regex.exec(targetText)) {
      // Do something with result[0].
    } 
    

  • Ironischerweise will mein Lint setzen == anstelle von = im While-Ausdruck.

    – Deutsch

    8. November 2019 um 15:36 Uhr

  • Eslint dazu zu bringen, die Single zu akzeptieren = Die Zuweisung kann wie folgt in Klammern eingeschlossen werden: while ((result = regex.exec(targetText)))

    – Schean

    14. November 2019 um 9:22 Uhr


  • Im zweiten Beispiel dort, ist Übereinstimmung ein Schlüsselwort oder eine Variable? Und wenn es eine Variable ist, was hält sie?

    – Cole Perry

    22. Januar 2020 um 21:26 Uhr

  • @ColePerry match ist die gesamte RegExp-Übereinstimmung, und $1 ist die erste Capture-Gruppe ()in diesem Beispiel nur eine.

    – Modular

    31. Januar 2020 um 22:09 Uhr

  • Hier funktioniert nur Ersetzen, da in Node.js das globale match/exec nur die Gesamtübereinstimmung ohne Gruppen zurückgibt.

    – mirik

    31. August 2020 um 16:14 Uhr

Benutzeravatar von tvanfosson
tvanfosson

Versuchen Sie es mit passen() auf der Zeichenfolge anstelle von exec (), obwohl Sie auch mit exec eine Schleife ausführen könnten. Match sollte Ihnen alle Matches auf einmal geben. Ich denke, Sie können den globalen Bezeichner auch weglassen.

reg = new RegExp(/e(.*?)e/);   
var matches = targetText.match(reg);

  • Verlinken Sie nicht zu w3schools. Sie sind nicht mit dem W3C verbunden und haben viele falsche Informationen. Sehen w3fools.com.

    – dbkaplun

    24. Juni 2012 um 5:21 Uhr


  • @MindVirus – Wenn Sie nachsehen möchten, haben sie eine Menge Dinge bereinigt, auf die w3fools.com hingewiesen hat. Ich benutze sie immer noch als schnelle, wenn auch nicht endgültige Ressource. Ähnlich wie man einen Spickzettel über K&R C verwenden könnte, um etwas Einfaches nachzuschlagen.

    – tvanfosson

    24. Juni 2012 um 13:34 Uhr

  • Als fortgeschrittener Entwickler bin ich bei w3schools bereits auf ein gutes halbes Dutzend eindeutiger Fehler gestoßen. Sie sind von meiner Partyliste gestrichen.

    – Mark McKenna

    18. Juli 2013 um 0:17 Uhr

  • MDN-Referenz für String.prototype.matchdeveloper.mozilla.org/en/docs/Web/JavaScript/Reference/…

    – Lee Goddard

    7. Dezember 2015 um 9:56 Uhr

  • Der Unterschied besteht darin, dass Sie die erfassten Gruppen nicht mitbekommen String.matchwährend RegExp.exec tut.

    – Vitim.us

    23. Mai 2018 um 19:11 Uhr


Ich bekam immer wieder Endlosschleifen, während ich die obigen Ratschläge befolgte, zum Beispiel:

var reg = /e(.*?)e/g;
var result;
while((result = reg.exec(targetText)) !== null) {
    doSomethingWith(result);
}

Das Objekt, dem zugewiesen wurde result war jeweils:

["", "", index: 50, input: "target text", groups: undefined]

In meinem Fall habe ich den obigen Code so bearbeitet:

const reg = /e(.*?)e/g;
let result = reg.exec(targetText);
while(result[0] !== "") {
    doSomethingWith(result);
    result = reg.exec(targetText);
}

targetText = "SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext"    
reg = new RegExp(/e(.*?)e/g);   
var result;
while (result = reg.exec(targetText))
{
    ...
}

  • Es funktioniert nicht. In JS kann Regex keine Gruppen mit globalem Flag extrahieren, sodass der Benutzer nur eine vollständige Übereinstimmung erhält.

    – mirik

    31. August 2020 um 16:11 Uhr

Christophers Benutzeravatar
Christoph

Sie können auch die Methode String.replace verwenden, um alle Elemente zu durchlaufen.

result = [];
 // Just get all numbers
"SomeT1extSomeT2extSomeT3ext".replace(/(\d+?)/g, function(wholeMatch, num) {
  // act here or after the loop...
  console.log(result.push(num));
  return wholeMatch;
});
console.log(result); // ['1', '2', '3']

Grüße

  • Es funktioniert nicht. In JS kann Regex keine Gruppen mit globalem Flag extrahieren, sodass der Benutzer nur eine vollständige Übereinstimmung erhält.

    – mirik

    31. August 2020 um 16:11 Uhr

Benutzeravatar von ncmathsadist
ncmathsadist

Ich habe das in einer Konsolensitzung (Chrome) gemacht.

> let reg = /[aeiou]/g;
undefined
> let text = "autoeciously";
undefined
> matches = text.matches(reg);
(7) ["a", "u", "o", "e", "i", "o", "u"]
> matches.forEach(x =>console.log(x));
a
u
o
e
i
o
u

1430740cookie-checkWie werden alle Elemente geloopt, die mit der Regex übereinstimmen?

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

Privacy policy