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.


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


@ 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


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


¿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


13

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


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)
        }
    }
}


1

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

para: This is just\na simple sentence

Utilizar: This .+ sentence


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


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); ` 

0

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


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?


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.