Cómo hacer que la expresión Regular no codicioso?
Estoy usando jQuery. Tengo una cadena con un bloque de caracteres especiales (begin y end). Quiero obtener el texto de ese bloque de caracteres especiales. Utilicé un objeto de expresión regular para buscar en la cadena. Pero, ¿cómo puedo decirle a jQuery que encuentre múltiples resultados cuando tenga dos caracteres especiales o más?
Mi 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>
Y mi código JavaScript:
$(document).ready(function() {
var takedata = $("#textcontainer").text();
var test = 'abcd adddb';
var filterdata = takedata.match(/(\[.+\])/);
alert(filterdata);
//end write js
});
Mi resultado es: [|cơ thử|nghiệm|] thị trường [|test2|đây là prueba lần 2|] chứng khoán [|Mỹ|día de la nuoc mi|] . Pero este no es el resultado que quiero : (. ¿Cómo obtener [texto] para los tiempos 1 y [demo] para los tiempos 2 ?
Acabo de hacer mi trabajo después de buscar información en Internet^^. Hago código como este:
var filterdata = takedata.match(/(\[.*?\])/g);
- mi resultado es: [/c th th th / nghimm/], [|test2|đây là test lnn 2/] ¡esto es correcto!. pero realmente no entiendo esto. ¿Puedes contestar mi por qué?
3 answers
Los modificadores de expresiones regulares no codiciosos son como sus contadores codiciosos pero con un ?
inmediatamente después de ellos:
* - zero or more
*? - zero or more (non-greedy)
+ - one or more
+? - one or more (non-greedy)
? - zero or one
?? - zero or one (non-greedy)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-04 18:38:25
Tienes razón en que la codicia es un problema:
--A--Z--A--Z--
^^^^^^^^^^
A.*Z
Si quieres hacer coincidir ambos A--Z
, tendrías que usar A.*?Z
(el ?
hace que el *
sea "reacio", o perezoso).
A veces hay mejores maneras de hacer esto, sin embargo, por ejemplo,
A[^Z]*+Z
Esto utiliza la clase de caracteres negados y el cuantificador posesivo, para reducir el retroceso, y es probable que sea más eficiente.
En su caso, la expresión regular sería:
/(\[[^\]]++\])/
Desafortunadamente Javascript regex no admite cuantificador posesivo, por lo que solo tendría que ver con:
/(\[[^\]]+\])/
Véase también
-
regular-expressions.info/Repetition
- Ver: Una alternativa a la Pereza
- Comparación de sabores
Resumen rápido
* 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
Tenga en cuenta que los cuantificadores reacios y posesivos también son aplicables a la finita repetition {n,m}
constructs.
Ejemplos 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"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-13 04:18:33
Creo que sería así
takedata.match(/(\[.+\])/g);
El g
al final significa global, por lo que no se detiene en el primer partido.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-22 08:27:42