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é?
Author: ROMANIA_engineer, 2010-05-13

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)
 385
Author: Asaph,
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


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"
 31
Author: polygenelubricants,
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.

 3
Author: iangraham,
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