He encontrado publicaciones muy similares, pero no puedo obtener mi expresión regular aquí.
Estoy tratando de escribir una expresión regular que devuelve una cadena que se encuentra entre otras dos cadenas. Por ejemplo: quiero obtener la cadena que reside entre las cadenas "vaca" y "leche".
Mi vaca siempre da leche
volvería
"siempre da"
Aquí está la expresión que he juntado hasta ahora:
(?=cow).*(?=milk)
Sin embargo, esto devuelve la cadena "vaca siempre da".
javascript
regex
string
phil
fuente
fuente
Respuestas:
Una búsqueda anticipada (esa
(?=
parte) no consume ninguna entrada. Es una afirmación de ancho cero (al igual que las comprobaciones de límites y las miradas posteriores).Desea una coincidencia regular aquí, para consumir la
cow
porción. Para capturar la parte intermedia, utiliza un grupo de captura (solo coloca la parte del patrón que deseas capturar entre paréntesis):No se necesitan lookaheads en absoluto.
fuente
matched[1]
, no todo el texto coincidente conmatched[0]
.([\s\S]*?)
lugar de(.*?)
.La solución más completa que funcionará en la gran mayoría de los casos es usar un grupo de captura con un patrón de coincidencia de puntos diferidos . Sin embargo, un punto
.
en JavaScript expresión regular no coincide con caracteres de salto de línea, por lo que, lo que va a funcionar en 100% de los casos es un[^]
o[\s\S]
/[\d\D]
/[\w\W]
construcciones.ECMAScript 2018 y una solución compatible más nueva
En entornos JavaScript que admiten ECMAScript 2018 , el
s
modificador permite.
hacer coincidir cualquier carácter, incluidos los caracteres de salto de línea, y el motor regex admite retrospectivas de longitud variable. Entonces, puedes usar una expresión regular comoEn ambos casos, la posición actual se verifica
cow
con cualquier 1/0 o más espacios en blanco despuéscow
, luego se iguala y consume cualquier carácter de 0+ lo menos posible (= agregado al valor de coincidencia), y luegomilk
se verifica (con cualquier 1/0 o más espacios en blanco antes de esta subcadena).Escenario 1: entrada de línea única
Este y todos los demás escenarios a continuación son compatibles con todos los entornos JavaScript. Ver ejemplos de uso al final de la respuesta.
cow
se encuentra en primer lugar, a continuación, un espacio, entonces cualquier 0+ caracteres distintos de caracteres de salto de línea, tan pocos como sea posible como*?
es un cuantificador perezoso, son capturados en el Grupo 1 y luego un espacio conmilk
debe seguir (y aquellos se emparejan y consume , también )Escenario 2: entrada multilínea
Aquí,
cow
y se hace coincidir un espacio primero, luego se combinan los caracteres 0+ lo menos posible y se capturan en el Grupo 1, y luegomilk
se hace coincidir un espacio con .Escenario 3: coincidencias superpuestas
Si tiene una cadena como
>>>15 text>>>67 text2>>>
y necesita obtener 2 coincidencias entre>>>
+number
+whitespace
y>>>
, no puede usar,/>>>\d+\s(.*?)>>>/g
ya que esto solo encontrará 1 coincidencia debido a que el>>>
anterior67
ya se consume al encontrar la primera coincidencia. Puede utilizar una búsqueda anticipada positiva para verificar la presencia del texto sin realmente "engullirlo" (es decir, agregarlo a la coincidencia):Vea el rendimiento de la demostración de expresiones regulares en línea
text1
y lostext2
contenidos del Grupo 1 encontrados.Consulte también Cómo obtener todas las coincidencias superpuestas posibles para una cadena .
Consideraciones de rendimiento
El patrón de coincidencia de puntos diferidos (
.*?
) dentro de los patrones de expresiones regulares puede ralentizar la ejecución del script si se proporciona una entrada muy larga. En muchos casos, la técnica de desenrollar el bucle ayuda en mayor medida. Intentando tomar todo entrecow
ymilk
desde"Their\ncow\ngives\nmore\nmilk"
, vemos que solo necesitamos unir todas las líneas que no comienzanmilk
, por lo tanto, en lugar decow\n([\s\S]*?)\nmilk
poder usar:Vea la demostración de expresiones regulares (si puede haberla
\r\n
, úsela/cow\r?\n(.*(?:\r?\n(?!milk$).*)*)\r?\nmilk/gm
). Con esta pequeña cadena de prueba, la ganancia de rendimiento es insignificante, pero con un texto muy grande, sentirá la diferencia (especialmente si las líneas son largas y los saltos de línea no son muy numerosos).fuente
Aquí hay una expresión regular que captará lo que hay entre la vaca y la leche (sin espacio inicial / final):
Un ejemplo: http://jsfiddle.net/entropo/tkP74/
fuente
.*
.*
codiciaRealmente no hay necesidad de mirar hacia adelante.
fuente
La respuesta elegida no funcionó para mí ... hmm ...
Simplemente agregue espacio después de la vaca y / o antes de la leche para recortar espacios de "siempre da"
fuente
?<=
no es compatible con Javascript.Pude obtener lo que necesitaba usando la solución de Martinho Fernandes a continuación. El codigo es:
Notarás que estoy alertando a la variable testRE como una matriz. Esto se debe a que testRE está regresando como una matriz, por alguna razón. La salida de:
Cambios en:
fuente
Simplemente use la siguiente expresión regular:
fuente
?<=
no es compatible con Javascript. Sin embargo, sería la forma de hacerlo.Encuentro que la expresión regular es tediosa y consume mucho tiempo dada la sintaxis. Como ya está usando JavaScript, es más fácil hacer lo siguiente sin regex:
fuente
Si los datos están en varias líneas, es posible que deba usar lo siguiente
Ejemplo de Regex 101
fuente
El método match () busca una cadena para una coincidencia y devuelve un objeto Array.
fuente
Tarea
Extraiga la subcadena entre dos cadenas (excluyendo estas dos cadenas)
Solución
fuente