Regex Une todos los caracteres entre dos cadenas

436

Ejemplo: "Esto es simplemente una frase simple".

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

0xbadf00d
fuente
11
Es posible que desee indicar en qué entorno está utilizando Regex. Puede haber diferencias dependiendo de exactamente lo que quiere decir con "ignorar" saltos de línea.
Andrew Barber

Respuestas:

647

Por ejemplo

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

Regexr

Utilicé (?<=)mirar hacia atrás y mirar hacia adelante (?=)para que "Esto es" y "oración" no se incluyan en el partido, 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 regex, de modo que .coincida con la nueva línea. Pero cómo lo haces depende de tu motor regex.

Lo siguiente es si usa .*o .*?. La primera es codiciosa y coincidirá hasta la última "oración" en su cadena, la segunda es perezosa y coincidirá hasta la próxima "oración" en su cadena.

Actualizar

Regexr

This is(?s)(.*)sentence

Donde (? S) activa el modificador dotall, haciendo que .coincidan 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

Stema
fuente
@ tchrist, lo siento, tuve que buscar esto. ¿Entiendo esto correcto y This is(?s)(.*)sentenceestaría funcionando?
Stema
@stema: Sí, eso debería funcionar para habilitar el modo "dot all" en la mayoría de las bibliotecas de expresiones regulares.
tchrist
1
Eso resolvió mi problema, pero ¿cómo incluyo un espacio en blanco en mi patrón? Intenté lo siguiente: "(. *?) ())" Para que coincida con el ")" al final de una secuencia, pero no funcionó.
0xbadf00d
28
Solo una nota: regexr dice ahora que mirar hacia atrás no es compatible con javascript
Kovo
2
¿Hay alguna manera 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
182

Cuantificador perezoso necesario

Resucitar esta pregunta porque la expresión regular en la respuesta aceptada no me parece 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 demo .

Necesita un cuantificador perezoso entre las dos miradas. Agregar un ?hace que la estrella sea perezosa.

Esto coincide con lo que quieres:

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

Ver demo . Eliminé el grupo de captura, que no era necesario.

Modo DOTALL para igualar 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) dot-all 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

zx81
fuente
Tienes razón sobre el grupo de captura. No sé por qué he hecho esto. Pero la diferencia entre .*y .*?también se explica en mi respuesta (el párrafo anterior a "Actualización"). Entonces no creo que mi respuesta sea incorrecta.
Stema
2
@stema Perdón por las críticas, mientras que ayer examiné algunas de tus respuestas, 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
39

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

Kaore
fuente
¿Cómo realizar una búsqueda perezosa de esta manera?
AGamePlayer
44
@AwQiruiGuo igual que el anterior. [\s\S]*?(también llamado: comodín no codicioso)
phil294
16

Esta:

This is (.*?) sentence

funciona en javascript.

Riyafa Abdul Hameed
fuente
13

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

vignesh
fuente
No sé por qué todos los votos endstringname
positivos
Me pareció ú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
2

En caso de que alguien esté buscando un ejemplo de esto dentro del contexto de Jenkins. Analiza el 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)
        }
    }
}
Cefos
fuente
1

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

AnirbanDebnath
fuente
1

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

para: This is just\na simple sentence

Utilizar: This .+ sentence

Roshna Omer
fuente
0

Sublime Text 3x

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

"Esto es" y "oración"

y escribes. * en el medio

es decir This is .* sentence

y esto debería hacerte bien

rsc05
fuente
No estoy seguro de que la pregunta sea sobre cómo hacer esto en Sublime Text pero funciona principalmente en Sublime Text. No funciona cuando sucede que 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.
Dylan Kinnett el
0

Así es como lo hice:
Esto fue más fácil para mí que tratar de descubrir 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); ` 
Bbb
fuente
0

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

vins
fuente
0

Llegué 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 los demás:

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

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?

alquimia
fuente
0

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, debemos recorrer los resultados y almacenarlos.

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

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

Alejandro
fuente