wake-up-neo.net

Wie kann man reguläre Ausdrücke zu nicht gierigen machen?

Ich benutze jQuery. Ich habe eine Zeichenfolge mit einem Block von Sonderzeichen (Anfang und Ende). Ich möchte den Text aus diesem Sonderzeichenblock erhalten. Ich habe ein Objekt mit regulären Ausdrücken für die Suche in Strings verwendet. Aber wie kann ich jQuery anweisen, mehrere Ergebnisse zu finden, wenn zwei oder mehr Sonderzeichen vorliegen?

Mein HTML:

<div id="container">
    <div id="textcontainer">
     Cuộc chiến pháp lý giữa [|cơ thử|nghiệm|] thị trường [|test2|đây là test lần 2|] chứng khoán [|Mỹ|day la nuoc my|] và ngân hàng đầu tư quyền lực nhất Phố Wall mới chỉ bắt đầu.
    </div>
</div>

und mein JavaScript Code:

$(document).ready(function() {
  var takedata = $("#textcontainer").text();
  var test = 'abcd adddb';
  var filterdata = takedata.match(/(\[.+\])/);

  alert(filterdata); 

  //end write js 
});

Mein Ergebnis ist: [| cơ thơ | nghiệm |] thị trịng [| test2 | đây là test lần 2 |] chứng khoán [| Mỹ | day la nuoc my |]. Aber das ist nicht das Ergebnis, das ich haben möchte :(. Wie bekomme ich [Text] für Zeiten 1 und [Demo] für Zeiten 2?


Ich habe gerade meine Arbeit erledigt, nachdem ich im Internet nach Informationen gesucht habe ^^. Ich mache Code wie folgt:

var filterdata = takedata.match(/(\[.*?\])/g);
  • mein Ergebnis ist: [| cơ thơ | nghiệm |], [| test2 | đây là test lần 2 |] das ist richtig !. aber ich verstehe das nicht wirklich. Kannst du mir antworten warum?
203
Rueta

Die nicht-gierigen Regex-Modifikatoren sind wie ihre gierigen Gegenstücke, aber mit einem ? unmittelbar nach ihnen:

*  - zero or more
*? - zero or more (non-greedy)
+  - one or more
+? - one or more (non-greedy)
?  - zero or one
?? - zero or one (non-greedy)
439
Asaph

Sie haben Recht, dass Gier ein Problem ist:

--A--Z--A--Z--
  ^^^^^^^^^^
     A.*Z

Wenn Sie beide A--Z Übereinstimmen möchten, müssen Sie A.*?Z Verwenden (das ? Macht das * "Widerstrebend" oder faul).

Es gibt jedoch manchmal bessere Möglichkeiten, dies zu tun, z.

A[^Z]*+Z

Dies verwendet eine negierte Zeichenklasse und einen Possessive Quantifier, um das Backtracking zu reduzieren, und ist wahrscheinlich effizienter.

In Ihrem Fall wäre der reguläre Ausdruck:

/(\[[^\]]++\])/

Leider unterstützt Javascript regex keine Possessive Quantifier, daher müssten Sie sich nur mit Folgendem befassen:

/(\[[^\]]+\])/

Siehe auch


Kurze Zusammenfassung

*   Zero or more, greedy
*?  Zero or more, reluctant
*+  Zero or more, possessive

+   One or more, greedy
+?  One or more, reluctant
++  One or more, possessive

?   Zero or one, greedy
??  Zero or one, reluctant
?+  Zero or one, possessive

Beachten Sie, dass die widerstrebenden und besitzergreifenden Quantifizierer auch auf Konstrukte mit endlicher Wiederholung {n,m} Anwendbar sind.

Beispiele in Java:

System.out.println("aAoZbAoZc".replaceAll("A.*Z", "!"));  // prints "a!c"
System.out.println("aAoZbAoZc".replaceAll("A.*?Z", "!")); // prints "a!b!c"

System.out.println("xxxxxx".replaceAll("x{3,5}", "Y"));  // prints "Yx"
System.out.println("xxxxxx".replaceAll("x{3,5}?", "Y")); // prints "YY"
35

Ich glaube es wäre so

takedata.match(/(\[.+\])/g);

das g am Ende bedeutet global, damit es nicht beim ersten Treffer endet.

3
iangraham