Regex Coincide con todos los personajes entre dos cadenas

Ejemplo: “Esto es simplemente una sentencia simple”.

Quiero unir cada personaje entre “Esto es” y “oración”. Los saltos de línea deben ignorarse. No puedo descifrar la syntax correcta.

Por ejemplo

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

Regexr

Usé lookbehind (?<=) Y look ahead (?=) que "This is" y "sentence" no estén incluidos en la coincidencia, pero esto depende de tu caso de uso, también puedes simplemente escribir This is(.*)sentence

Lo importante aquí es que active el modo "dotall" de su motor de expresiones regulares, de modo que . está coincidiendo con la nueva línea. Pero cómo lo haces depende de tu motor de expresiones regulares.

El siguiente paso es si usa .* O. .*? . El primero es codicioso y coincidirá hasta la última "oración" en tu cadena, el segundo es flojo y coincidirá hasta la siguiente "oración" en tu cadena.

Actualizar

Regexr

 This is(?s)(.*)sentence 

Donde el (?) Enciende el modificador de Dallall, haciendo que el . haciendo coincidir los caracteres de nueva línea.

Actualización 2:

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

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

Lazy Quantifier Needed

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á con my first sentence. This is my second my first sentence. This is my second en This is my first sentence. This is my second sentence. This is my first sentence. This is my second sentence.

Ver demostración

Necesita un cuantificador perezoso entre las dos alternativas. Agregar un ? hace que la estrella sea floja.

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 con los saltos de línea

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

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

Referencia

  • Los muchos grados de codicia Regex
  • Repetición con Star y Plus

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

Esta:

 This is (.*?) sentence 

funciona en javascript.

usa esto: (?<=beginningstringname)(.*\n?)(?=endstringname)

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

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

Sublime Text 3x

En texto sublime, simplemente escriba las dos palabras que le interesan, por ejemplo, en su caso, es

“Esto es” y “oración”

y escribes. * entre medio

es decir, This is .* sentence

y esto debería hacerte bien

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

para una búsqueda rápida en VIM, puede usar en el indicador de Vim Control: / This is. * \ _. * sentence