2010-01-21 21 views
5

tengo una expresión regular como el siguiente ejemplo simplificado:uso de JavaScript expresión regular para encontrar el primer y el partido más largo

var exp = /he|hell/; 

Cuando lo ejecuto en una cadena que me dará el primer partido, fx:

var str = "hello world"; 
var match = exp.exec(str); 
// match contains ["he"]; 

Quiero la primera y la mayor coincidencia posible, y me comparo por índice y luego por longitud.

Dado que la expresión se combina de una matriz de RegExp, estoy buscando una manera de encontrar la coincidencia más larga sin tener que volver a escribir la expresión regular.

¿Eso es posible?

Si no es así, estoy buscando una forma de analizar fácilmente la expresión y organizarla en el orden correcto. Pero no puedo encontrar la manera ya que las expresiones podría ser mucho más complejo, fx:

var exp = /h..|hel*/ 
+0

Su segundo ejemplo sería mucho más interesante si fuera por ejemplo: '/ h .... | hel * /' –

+0

Me parece lo mismo. De hecho, quería ilustrar que la expresión regular más larga no era necesariamente la más larga. Mi expresión simple debería haber sido algo así como '/ h. *? | Hello /'. Pero supongo que los usuarios de este sitio saben lo que quiero decir de todos modos. Al menos lo hiciste :-) –

+0

Si las aserciones look-behind de ancho variable fueran posibles en javascript (como lo son, por ejemplo, en los sabores regex de .NET y JGsoft) podrías lograrlo de esta manera: 'exp = /.*(?<=h .. | hel *)/'. Pero hasta ahora esta característica no se espera en JS. –

Respuesta

2

Todas las implementaciones de expresiones regulares que conozco intentarán (intentarán) hacer coincidir los caracteres/patrones de izquierda a derecha y terminarán cuando encuentren una coincidencia global.

En otras palabras: si quiere asegurarse de obtener la coincidencia más larga posible, deberá probar todos sus patrones (por separado), almacenar todas las coincidencias y luego obtener la coincidencia más larga entre todas las posibles coincidencias.

+1

Lo sé. Edité la pregunta. Gracias por la respuesta. Comenzaré por encontrar el índice de la primera coincidencia, y luego añadiré^a cada RegExp y buscaré la subcadena comenzando desde el primer índice, ya que buscar expresiones que no están allí requiere que se ejecute todo el texto. –

3

¿Qué tal /hell|he/?

+3

No siempre es tan obvio como en este ejemplo. – Jirka

+0

Simple pero devastador. :) – zx81

1

No se puede hacer "coincidencia más larga" (o cualquier cosa que implique contar, menos look-aheads) con expresiones regulares.

Su mejor opción es encontrar todos los coincidencias, y simplemente compare las duraciones en el programa.

+0

Al encontrar todas las coincidencias, te refieres a separar la expresión regular en | y buscando cada parte individualmente? (Por lo tanto, en lugar de buscar (a | (b (c | d)), habría que buscar 3 expresiones: a, bc, bd. Me pregunto si también hay que tener en cuenta la opcionalidad). O ¿Existe algún apoyo para encontrar todas las coincidencias? – Jirka

+0

@ Jirka-x1: Hay soporte para encontrar la * próxima * coincidencia, simplemente me refería a escribir un ciclo que revisa cada coincidencia y registra cuál es el más largo. –

+0

No estoy seguro acerca de JavaScript, pero en Java, su enfoque no funciona 'Matcher m = Pattern.compile ("él | infierno") matcher ("hola mundo");.. tiempo (m.find()) { System.out.println (m.group()); } ' produce un único resultado: 'he'. Segunda y subsiguiente invoca Las clases de find() comienzan en el primer carácter que no coincide con la invocación anterior. – Jirka

0

No sé si esto es lo que estás buscando (teniendo en cuenta esta cuestión es más de 8 años de edad ...), pero aquí está mi grano de sal:

(Cambio de la que el infierno va a realizar la búsqueda en función de la primera más grande)

var exp = /hell|he/; 
var str = "hello world"; 
var match = exp.exec(str); 

if(match) 
{ 
    match.sort(function(a, b){return b.length - a.length;});    
    console.log(match[0]); 
} 

Dónde partido [ 0] va a ser el el más largo de todos los hilos combinados.

Cuestiones relacionadas