validate test regulares regular regexp probar online one how expresiones regex regex-greedy

regex - test - Necesita expresiones regulares para buscar subcadenas entre dos tokens



regexp javascript (3)

Estás usando un patrón codicioso al no especificar el ? en eso. Prueba esto:

".+B=(.+?);.+"

Sospecho que esto ya ha sido respondido en alguna parte, pero no puedo encontrarlo, así que ...

Necesito extraer una cadena entre dos tokens en una cadena más grande, en la cual el segundo token probablemente aparecerá de nuevo significando ... (pseudo código ...)

myString = "A=abc;B=def_3%^123+-;C=123;" ; myB = getInnerString(myString, "B=", ";" ) ; method getInnerString(inStr, startToken, endToken){ return inStr.replace( EXPRESSION, "$1"); }

entonces, cuando ejecuto esto usando la expresión " .+B=(.+);.+ " Obtengo "def_3% ^ 123 + -; C = 123;" presumiblemente porque solo busca la ÚLTIMA instancia de '';'' en la cadena, en lugar de detenerse en la primera, se trata.

Intenté usar (? =) En busca de ese primero '';'' pero me da el mismo resultado.

Parece que no puedo encontrar una referencia regExp que explique cómo se puede especificar el token "NEXT" en lugar de uno al final.

cualquier y toda ayuda muy apreciada.

Pregunta similar sobre SO:


Prueba esto:

B=([^;]+);

Esto coincide con todo entre B= y ; a menos que sea a ; . Por lo tanto, combina todo entre B= y el primero ; después de eso.


(Esto es una continuación de la conversación de los comentarios a la respuesta de Evan).

Esto es lo que sucede cuando se aplica su expresión regular (corregida): Primero, el .+ Coincide con toda la cadena. Luego retrocede, renunciando a la mayoría de los caracteres con los que coincide hasta que llega al punto donde B= puede coincidir. Entonces, el (.+?) Empareja (y captura) todo lo que ve hasta que la siguiente parte, el punto y coma, pueda coincidir. Luego, el final .+ Devora los caracteres restantes.

Todo lo que realmente te interesa es el "B =" y el ";" y lo que sea que esté entre ellos, ¿por qué unir el resto de la cuerda? La única razón por la que tiene que hacer eso es para poder reemplazar toda la cadena con el contenido del grupo de captura. Pero ¿por qué molestarse en hacer eso si puede acceder directamente a los contenidos del grupo? Aquí hay una demostración (en Java, porque no puedo decir qué idioma estás usando):

String s = "A=abc;B=def_3%^123+-;C=123;"; Pattern p = Pattern.compile("B=(.*?);"); Matcher m = p.matcher(s); if (m.find()) { System.out.println(m.group(1)); }

¿Por qué un "reemplazo" cuando un "hallazgo" es mucho más directo? Probablemente porque tu API lo hace más fácil; es por eso que lo hacemos en Java. Java tiene varios métodos de conveniencia orientados a replaceAll() regex en su clase String: replaceAll() , replaceFirst() , split() y matches() (que devuelve true iff la expresión regular coincide con la cadena completa ), pero no find() . Y tampoco hay un método conveniente para acceder a los grupos de captura. No podemos igualar la elegancia de Perl one-liners como este:

print $1 if ''A=abc;B=def_3%^123+-;C=123;'' =~ /B=(.*?);/;

... así que nos contentamos con hacks como este:

System.out.println("A=abc;B=def_3%^123+-;C=123;" .replaceFirst(".+B=(.*?);.+", "$1"));

Solo para ser claros, no estoy diciendo que no use estos hacks, o que haya algo mal con la respuesta de Evan, no es así. Creo que deberíamos entender por qué los usamos y qué concesiones estamos haciendo cuando lo hacemos.