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);
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)
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:
/(\[[^\]]+\])/
* 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"
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.