web-dev-qa-db-fra.com

Comment faire de l'expression régulière en non-gourmande?

J'utilise jQuery. J'ai une chaîne avec un bloc de caractères spéciaux (début et fin). Je veux obtenir le texte de ce bloc de caractères spéciaux. J'ai utilisé un objet d'expression régulière pour la recherche dans la chaîne. Mais comment puis-je dire à jQuery de rechercher plusieurs résultats lorsque deux caractères spéciaux ou plus sont utilisés?

Mon 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>

et mon code JavaScript:

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

  alert(filterdata); 

  //end write js 
});

Mon résultat est: [| cơ thử | nghiệm |] qui [tran] [| test2 | đây là test ln 2 |] chứng khoán [| M | jour la nuoc |] . Mais ce n'est pas le résultat que je veux :(. Comment obtenir [texte] pour les temps 1 et [démo] pour les temps 2?


Je viens de faire mon travail après avoir cherché des infos sur internet ^^. Je crée un code comme ceci:

var filterdata = takedata.match(/(\[.*?\])/g);
  • mon résultat est: [| c thử | nghiệm |], [| test2 | đây là test ln 2 |] c'est vrai !. mais je ne comprends pas vraiment cela. Pouvez-vous répondre à mon pourquoi?
203
Rueta

Les modificateurs de regex non-gloutons ressemblent à leurs contreparties gloutonnes mais suivis d'un ? les suivant immédiatement:

*  - 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

Vous avez raison, la gourmandise est un problème:

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

Si vous voulez faire correspondre les deux A--Z, vous devez utiliser A.*?Z (le ? rend le * "réticent" ou paresseux).

Il existe parfois de meilleures façons de le faire, par exemple.

A[^Z]*+Z

Ceci utilise une classe de caractère et un quantificateur possessif annulés, afin de réduire les retours en arrière, et sera probablement plus efficace.

Dans votre cas, le regex serait:

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

Malheureusement Les expressions rationnelles Javascript ne supportent pas le quantificateur possessif, vous devrez donc simplement faire avec:

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

Voir également


Résumé rapide

*   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

Notez que les quantificateurs réticents et possessifs sont également applicables aux constructions de répétition finie {n,m}.

Exemples en 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

Je crois que ce serait comme ça

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

le g à la fin signifie global, donc il ne s'arrête pas au premier match.

3
iangraham