Regex Coincidir con todos los caracteres entre dos cadenas

548

Ejemplo: "Esto es solo \ una oración simple".

Quiero hacer coincidir todos los caracteres entre "Esto es" y "oración". Los saltos de línea deben ignorarse. No puedo encontrar la sintaxis correcta.

1
  • 14
    Es posible que desee indicar en qué entorno está utilizando Regex. Puede haber diferencias dependiendo exactamente de lo que quiera decir con "ignorar" saltos de línea. 24 de mayo de 2011 a las 11:57
827

Por ejemplo

(?<=This is)(.*)(?=sentence)

Regexr

Usé (?<=)mirar atrás y mirar hacia adelante (?=)para que "Esto es" y "oración" no estén incluidos en la coincidencia, pero esto depende de su caso de uso, también puede simplemente escribir This is(.*)sentence.

Lo importante aquí es que active el modo "dotall" de su motor de expresiones regulares, de modo que .coincida con la nueva línea. Pero la forma de hacer esto depende de su motor de expresiones regulares.

Lo siguiente es si usa .*o .*?. El primero es codicioso y coincidirá hasta la última "oración" en su cadena, el segundo es perezoso y coincidirá hasta la siguiente "oración" en su cadena.

Actualizar

Regexr

This is(?s)(.*)sentence

Donde el (? S) enciende el modificador dotall, haciendo .coincidir los caracteres de nueva línea.

Actualización 2:

(?<=is \()(.*?)(?=\s*\))

coincide con su ejemplo "Esta es una oración (simple)". Ver aquí en Regexr

17
  • 1
    @tchrist, lo siento, tuve que buscar esto. ¿Entiendo esto correctamente y This is(?s)(.*)sentenceestaría funcionando?
    stema
    24 de mayo de 2011 y 12:20 p.m.
  • @stema: Sí, eso debería funcionar para habilitar el modo "dot all" en la mayoría de las bibliotecas de expresiones regulares.
    tchrist
    24 de mayo de 2011 a las 12:21
  • 1
    Eso resolvió principalmente mi problema, pero ¿cómo incluyo un carácter de espacio en blanco en mi patrón? Intenté lo siguiente: "(. *?) ())" Para que coincida con ")" al final de una secuencia, pero no funcionó. 24 de mayo de 2011 a las 14:09
  • 32
    Solo una nota: regexr dice ahora que la búsqueda hacia atrás no es compatible con javascript
    Kovo
    14/04/2014 a las 10:53
  • 2
    ¿Hay alguna forma de lidiar con instancias repetidas de esta división en un bloque de texto? Por ejemplo: "Esto es solo \ una oración simple. Aquí hay algunas cosas adicionales. Esto es solo \ una oración simple. Y aquí hay algunas cosas más. Esto es solo una oración simple". Actualmente coincide con la cadena completa, en lugar de cada instancia.
    jzadra
    6/07/18 a las 13:47
224

Se necesita un cuantificador perezoso

Resucitando esta pregunta porque la expresión regular en la respuesta aceptada no me parece del todo correcta. ¿Por qué? Porque

(?<=This is)(.*)(?=sentence)

coincidirá my first sentence. This is my secondenThis is my first sentence. This is my second sentence.

Ver demostración .

Necesita un cuantificador perezoso entre los dos métodos alternativos. Agregar un ?hace que la estrella sea perezosa.

Esto coincide con lo que quieres:

(?<=This is).*?(?=sentence)

Ver demostración . Eliminé el grupo de captura, que no era necesario.

Modo DOTALL para coincidir a través de saltos de línea

Tenga en cuenta que en la demostración, el "punto coincide con el modo de salto de línea" (también conocido como punto-todo) está configurado (vea cómo activar DOTALL en varios idiomas ). En muchos sabores de (?s)expresiones regulares, puede configurarlo con el modificador en línea , convirtiendo la expresión en:

(?s)(?<=This is).*?(?=sentence)

Referencia

2
  • Tiene razón sobre el grupo de captura. No sé por qué hice esto. Pero la diferencia entre .*y .*?también se explica en mi respuesta (el párrafo antes de "Actualizar"). Entonces no creo que mi respuesta sea incorrecta.
    stema
    20 de mayo de 2014 a las 12:28
  • 2
    @stema Perdón por las minucias, mientras revisaba algunas de sus respuestas ayer, esa es la única que me hizo temblar. :) Suavicé la primera línea del is incorrecta doesn't seem quite correct to me... espero que no haga que la contracción nerviosa, probablemente sólo una diferencia de percepción acerca de cuál debe ser la expresión regular para una tal respuesta de alto tráfico.
    zx81
    20 de mayo de 2014 a las 20:20
46

Prueba This is[\s\S]*?sentence, funciona en javascript

2
  • ¿Cómo realizar una búsqueda perezosa de esta manera? 3 de noviembre de 2015 a las 16:52
  • 4
    @AwQiruiGuo igual que arriba. [\s\S]*?(también llamado: comodín no codicioso)
    phil294
    9/04/2016 a las 16:54
19

Esta:

This is (.*?) sentence

funciona en javascript.

0
15

utilizar esta: (?<=beginningstringname)(.*\n?)(?=endstringname)

2
  • No sé por qué todos los votos positivos, esto permite saltos de línea 0-1, y el salto de línea debe ser inmediatamente anterior. endstringname
    OGHaza
    22/11/2013 a las 11:46
  • Encontré útil eliminar el comienzo de las líneas de registro (marca de tiempo, etc.). Usé una nueva línea para la cadena inicial y "at" para la cadena final.
    Stan
    18 de enero de 2017 a las 5:19
4

Esto funcionó para mí (estoy usando VS Code ):

por: This is just\na simple sentence

Usar: This .+ sentence

2
  • 1
    ¡¡Exactamente lo que estaba buscando!! ¡Gracias! 24/09/20 a las 0:01
  • 1
    Esto es mucho más legible y más fácil de recordar que otras soluciones. 14 de junio a las 8:30
2

En caso de que alguien esté buscando un ejemplo de esto dentro de un contexto de Jenkins. Analiza build.log y si encuentra una coincidencia, falla la compilación con la coincidencia.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

node{    
    stage("parse"){
        def file = readFile 'build.log'

        def regex = ~"(?s)(firstStringToUse(.*)secondStringToUse)"
        Matcher match = regex.matcher(file)
        match.find() {
            capturedText = match.group(1)
            error(capturedText)
        }
    }
}
2

RegEx para hacer coincidir todo entre dos cadenas utilizando el enfoque de Java.

List<String> results = new ArrayList<>(); //For storing results
String example = "Code will save the world";

Usemos objetos Pattern y Matcher para usar RegEx (. ?) * .

Pattern p = Pattern.compile("Code "(.*?)" world");   //java.util.regex.Pattern;
Matcher m = p.matcher(example);                      //java.util.regex.Matcher;

Dado que Matcher puede contener más de una coincidencia, necesitamos recorrer los resultados y almacenarlos.

while(m.find()){   //Loop through all matches
   results.add(m.group()); //Get value and store in collection.
}

Este ejemplo contendrá sólo "guardará la" palabra, pero en el texto más grande probablemente encontrará más coincidencias.

1

Simplemente puede usar esto: \This is .*? \sentence

1

Aterricé aquí en mi búsqueda de expresiones regulares para convertir esta sintaxis de impresión entre print "string", en Python2 en scripts antiguos con: print ("string"), para Python3. Funciona bien; de lo contrario, use 2to3.py para conversiones adicionales. Aquí está mi solución para otros:

Pruébelo en Regexr.com (no funciona en NP ++ por alguna razón):

find:     (?<=print)( ')(.*)(')
replace: ('$2')

para variables:

(?<=print)( )(.*)(\n)
('$2')\n

para etiqueta y variable:

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n

¿Cómo reemplazar todas las "cadenas" de impresión en Python2 con print ("cadena") para Python3?

0

Así es como lo hice:
esto fue más fácil para mí que tratar de averiguar la expresión regular específica necesaria.

int indexPictureData = result.IndexOf("-PictureData:");
int indexIdentity = result.IndexOf("-Identity:");
string returnValue = result.Remove(indexPictureData + 13);
returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); ` 
0

para una búsqueda rápida en VIM, puede usar en el indicador de Vim Control: / Esto es. * \ _. * oración

0

¿Hay alguna forma de lidiar con las instancias repetidas de esta división en un bloque de texto? Por ejemplo: "Esto es solo \ una oración simple. Aquí hay algunas cosas adicionales. Esto es solo \ una oración simple. Y aquí hay algunas cosas más. Esto es solo una oración simple". para que coincida con cada instancia en lugar de la cadena completa, use el siguiente código:

data = "This is just\na simple sentence. Here is some additional stuff. This is just\na simple sentence. And here is some more stuff. This is just\na simple sentence."

pattern = re.compile('This is (?s).*? sentence')

for match_instance in re.finditer(pattern, data):
    do_something(match_instance.group())
-1

Texto sublime 3x

En texto sublime, simplemente escribe las dos palabras que te interesa mantener, por ejemplo, en tu caso es

"Esto es" y "oración"

y tu escribes. * en el medio

es decir This is .* sentence

y esto debería hacerte bien

1
  • No estoy seguro de que la pregunta sea sobre cómo hacer esto en Sublime Text, pero principalmente funciona en Sublime Text. No funciona cuando hay un salto de línea entre "Esto es" y "oración". Además, el texto sublime también selecciona "Esto es" y "Oración" en lugar de solo el texto entre esas dos cadenas. 16/11/18 a las 20:52