Come rendere l'espressione regolare in non avida?


227

Sto usando jQuery. Ho una stringa con un blocco di caratteri speciali (inizio e fine). Voglio ottenere il testo da quel blocco di caratteri speciali. Ho usato un oggetto espressione regolare per la ricerca in-string. Ma come posso dire a jQuery di trovare più risultati quando hanno due caratteri speciali o più?

Il mio HTML:

<div id="container">
    <div id="textcontainer">
     Cuc chiến pháp lý gia [|cơ thử|nghim|] th trường [|test2|đây là test ln 2|] chng khoán [|Mỹ|day la nuoc my|] và ngân hàng đầu tư quyn lc nht Ph Wall mi ch bt đầu.
    </div>
</div>

e il mio codice JavaScript:

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

  alert(filterdata); 

  //end write js 
});

Il mio risultato è: [| cơ thử | nghiệm |] thị trường [| test2 | đây là test lần 2 |] chứng khoán [| Mỹ | day la nuoc my |] . Ma questo non è il risultato che voglio :(. Come ottenere [testo] per i tempi 1 e [demo] per i tempi 2?


Ho appena fatto il mio lavoro dopo aver cercato informazioni su Internet ^^. Faccio il codice in questo modo:

var filterdata = takedata.match(/(\[.*?\])/g);
  • il mio risultato è: [| cơ thử | nghiệm |], [| test2 | đây là test lần 2 |] questo è giusto !. ma non lo capisco davvero. Puoi rispondere al mio perché?

Risposte:


492

I modificatori regex non avidi sono come le loro controparti avide ma con un ?immediatamente successivo:

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

29
potrebbe essere utile notare che ?da solo significa 'uno o zero' (ma è goloso!). Ad esempio, 'bb'.replace(/b?/, 'a') //'ab'e'bb'.replace(/c?/, 'a') //'abb'
Hashbrown

1
come ha fatto a non trovare nulla lì
Muhammad Umer,

1
@MuhammadUmer Penso che lo stia suggerendo perché cnon corrisponderà, ma tu hai il ?, che è 0 or 1, quindi andrà a corrispondere 0 number of c characters, quindi sostituendolo. Non ho idea di come funzioni, perché non si compila in nessun motore regex che ho provato 😢
Noctis,

35

Hai ragione sul fatto che l'avidità è un problema:

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

Se vuoi abbinare entrambi A--Z, dovresti usare A.*?Z(il ?rende *"riluttante", o pigro).

A volte ci sono modi migliori per farlo, ad es

A[^Z]*+Z

Questo utilizza classe di caratteri negata e quantificatore possessivo, per ridurre il backtracking ed è probabilmente più efficiente.

Nel tuo caso, il regex sarebbe:

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

Purtroppo Javascript regex non supporta il quantificatore possessivo, quindi avresti solo a che fare con:

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

Guarda anche


Riepilogo rapido

*   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

Si noti che i quantificatori riluttanti e possessivi sono applicabili anche ai {n,m}costrutti a ripetizione finita .

Esempi 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"

copio la tua regex nel mio lavoro e il risultato è: quantificatore non valido + \]) [Break on this error] var filterdata = takedata.match (/ (\ [[[[\ \]] ++ \]) /); \ n ( firebugs + Firefox) qualcosa non va?
Rueta,

@Rueta: apparentemente il sapore Javascript non supporta possessivo. Ho modificato la mia risposta per riflettere questo fatto. Puoi semplicemente usarne uno +anziché due.
poligenelubrificanti

1
Sebbene i gruppi atomici possano essere utilizzati al posto di quantificatori possessivi, JavaScript non supporta neanche i gruppi atomici. Ma c'è una terza alternativa, vedi questo: instanceof.me/post/52245507631/… -you can emulate atomic grouping with LookAhead. (?>a) becomes (?=(a))\1
Roland Pihlakas,

2
Questa è una risposta Java per una domanda JavaScript e Java! = JavaScript. Lettori, prendete nota.
Roshambo,

3

Credo che sarebbe così

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

l' gall'estremità mezzi globale, in modo che non si ferma alla prima corrispondenza.


sì, hai ragione in / g. ho appena fatto il mio lavoro con la tua risposta / g ^^. Ma quando eseguo regolarmente /(\[.+\[)/g il mio risultato è: [| cơ thử | nghiệm |] thị trường [| test2 | đây là test lần 2 |] chứng khoán [| Mỹ | day la nuoc my |] :(
Rueta,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.