¿Cómo puedo unir cualquier personaje en múltiples líneas en una expresión regular?

Por ejemplo, esta expresión regular

(.*) 

coincidirá:

 abcde 

Pero, ¿cómo hago para que coincida en múltiples líneas?

 abcde fghij 

Depende del idioma, pero debe haber un modificador que pueda agregar al patrón de expresiones regulares. En PHP es:

 /(.*)/s 

La s al final hace que el punto coincida con todos los caracteres, incluidas las líneas nuevas.

Prueba esto:

 ((.|\n)*) 

Básicamente dice “cualquier personaje o una nueva línea” repetida cero o más veces.

Si está utilizando la búsqueda de Eclipse, puede habilitar la opción “DOTALL” para hacer ‘.’ relaciona cualquier caracter incluyendo los delimitadores de linea: simplemente agrega “(? s)” al principio de tu cadena de búsqueda. Ejemplo:

 (?s).* 

En JavaScript, use /[\S\s]*/ . Fuente

La pregunta es, ¿puede . el patrón coincide con cualquier personaje? La respuesta varía de un motor a otro. La principal diferencia es si el patrón es utilizado por una biblioteca de expresiones regex POSIX o no POSIX.

Nota especial sobre lua-patterns : no se consideran expresiones regulares, pero . coincide con cualquier char allí, al igual que los motores basados ​​en POSIX.

Otra nota sobre matlab y octava : el . coincide con cualquier char por defecto ( demo ): str = "abcde\n fghij"; expression = '(.*)*'; [tokens,matches] = regexp(str,expression,'tokens','match'); str = "abcde\n fghij"; expression = '(.*)*'; [tokens,matches] = regexp(str,expression,'tokens','match'); (los tokens contienen un elemento abcde\n fghij ).

Además, en todas las gramáticas de regex de boost , el punto coincide con los saltos de línea por defecto. La gramática ECMAScript de Boost le permite desactivar esto con regex_constants::no_mod_m ( source ).

En cuanto a Oracle (está basado en POSIX), use la opción n ( demo ): select regexp_substr('abcde' || chr(10) ||' fghij', '(.*)', 1, 1, 'n', 1) as results from dual

Motores basados ​​en POSIX :

tcl ( demo ), postgresql ( demo ), r (TRE, motor predeterminado de base R sin perl=TRUE , para la base R con perl=TRUE o para los patrones de stringr / stringi , use el modificador en línea (?s) ) ( demo ) . Un mero . ya coincide con los saltos de línea, no es necesario usar ningún modificador.

Motores no basados ​​en POSIX :

  • php – Use s modificador PCRE_DOTALL modificador : preg_match('~(.*)~s', $s, $m) ( demo )
  • c # – Usar RegexOptions.Singleline flag ( demo ):
    var result = Regex.Match(s, @"(.*)", RegexOptions.Singleline).Groups[1].Value;
    var result = Regex.Match(s, @"(?s)(.*)").Groups[1].Value;
  • powershell – Use (?s) opción en línea: $s = "abcde`nfghij"; $s -match "(?s)(.*)"; $matches[1] $s = "abcde`nfghij"; $s -match "(?s)(.*)"; $matches[1]
  • perl – Use s modifier (o (?s) versión en línea al inicio) ( demo ): /(.*)/s
  • python : use re.DOTALL (o re.S ) o modificador en línea (?s) ( demo ): m = re.search(r"(.*)", s, flags=re.S) ( y luego if m: print(m.group(1)) )
  • java – Use el modificador Pattern.DOTALL (o el Pattern.DOTALL inline (?s) ) ( demo ): Pattern.compile("(.*)", Pattern.DOTALL)
  • groovy – Use (?s) modificador en el patrón ( demo ): regex = /(?s)(.*)/
  • scala – Modificador de uso (?s) ( demo ): "(?s)(.*)".r.findAllIn("abcde\n fghij").matchData foreach { m => println(m.group(1)) }
  • javascript – Utilice [^] o soluciones [\d\D] / [\w\W] / [\s\S] ( demo ): s.match(/([\s\S]*)/)[1]
  • c ++ ( std::regex ) Utilice [\s\S] o las soluciones temporales de JS ( demo ): regex rex(R"(([\s\S]*))");
  • vba : utilice el mismo método que en JavaScript, ([\s\S]*) .
  • ruby – Use /m modificador MULTILINE ( demo ): s[/(.*)/m, 1]
  • ir – Use el modificador en línea (?s) al inicio ( demo ): re: = regexp.MustCompile(`(?s)(.*)`)
  • swift – Use dotMatchesLineSeparators o (más fácil) pase el modificador en línea (?s) al patrón: let rx = "(?s)(.*)"
  • objective-c – Igual que Swift, (?s) funciona de la manera más fácil, pero así es cómo se puede usar la opción : NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionDotMatchesLineSeparators error:&regexError];
  • re2 , google-apps-script – Use (?s) modificador ( demo ): "(?s)(.*)" (en Google Spreadsheets, =REGEXEXTRACT(A2,"(?s)(.*)") )

NOTAS EN (?s) :

En la mayoría de los motores no POSIX, se puede usar el modificador en línea (?s) (o la opción de indicador incrustado) para hacer cumplir . para unir saltos de línea.

Si se coloca al comienzo del patrón, (?s) Cambia el comportamiento de todos . en el patrón. Si el (?s) se coloca en algún lugar después del comienzo, solo aquellos . se verán afectados que se ubican a la derecha del mismo a menos que este sea un patrón pasado a Python re . En Python re , independientemente de la ubicación (?s) , todo el patrón . Son afectados. El efecto (?s) se detiene usando (?-s) . Un grupo modificado se puede usar para afectar solo un rango específico de un patrón de Delim1(?s:.*?)\nDelim2.* regulares (por ejemplo, Delim1(?s:.*?)\nDelim2.* Hará que la primera .*? Coincida con las nuevas líneas y la segunda .* Solo coincidirá con el rest de la línea).

Nota POSIX :

En motores no regex, para hacer coincidir cualquier char, se pueden usar construcciones [\s\S] / [\d\D] / [\w\W] .

En POSIX, [\s\S] no coincide con ningún carácter (como en JavaScript o cualquier otro motor que no sea POSIX) porque las secuencias de escape de expresiones regulares no se admiten dentro de las expresiones de corchetes. [\s\S] se analiza como expresiones de corchetes que coinciden con un único carácter, \ o s o S

([\s\S]*)

El punto coincide con todos excepto con líneas nuevas (\ r \ n). Entonces use \ s \ S, que hará coincidir TODOS los caracteres.

En Ruby ruby puede usar la opción ‘ m ‘ (multilínea):

 /YOUR_REGEXP/m 

Consulte la documentación de Regexp en ruby-doc.org para obtener más información.

"." normalmente no coincide con los saltos de línea. La mayoría de los motores regex le permite agregar el S flag (también llamado DOTALL y SINGLELINE ) para hacer "." también coincide con nuevas líneas. Si eso falla, podrías hacer algo como [\S\s] .

Para Eclipse funcionaba la siguiente expresión:

Foo

jadajada Bar ”

Expresión regular:

 Foo[\S\s]{1,10}.*Bar* 
 /(.*)/s 

s causa que Dot (.) coincida con los retornos de carro

también podemos usar

 (.*?\n)*? 

para que coincida con todo, incluida la nueva línea sin codiciosos

Esto hará que la nueva línea sea opcional

 (.*?|\n)*? 

Tenga en cuenta que (.|\n)* puede ser menos eficiente que (por ejemplo) [\s\S]* (si las expresiones regulares de su idioma admiten tales escapes) y que encontrar cómo especificar el modificador que lo hace. también coincide con nuevas líneas. O puede ir con POSIXy alternativas como [[:space:][:^space:]]* .

Use RegexOptions.Singleline, cambia el significado de. para incluir nuevas líneas

Regex.Replace (content, searchText, replaceText, RegexOptions.Singleline);

Solución:

Use el modificador de patrones sU obtendrá la coincidencia deseada en PHP.

ejemplo:

 preg_match('/(.*)/sU',$content,$match); 

Fuente:

http://dreamluverz.com/developers-tools/regex-match-all-including-new-line http://php.net/manual/en/reference.pcre.pattern.modifiers.php

En la expresión regular basada en Java, puede usar [\s\S]

En el contexto del uso en idiomas, las expresiones regulares actúan en cadenas, no en líneas. Entonces debería poder usar la expresión regular normalmente, suponiendo que la cadena de entrada tenga múltiples líneas.

En este caso, la expresión regular dada coincidirá con la cadena completa, ya que “” está presente. Dependiendo de los detalles de la implementación de expresiones regulares, el valor de $ 1 (obtenido de “(. *)”) Será “fghij” o “abcde \ nfghij”. Como otros han dicho, algunas implementaciones le permiten controlar si el “.” coincidirá con la nueva línea, dándole la opción.

El uso de expresiones regulares basadas en líneas suele ser para líneas de comando como egrep.

Tuve el mismo problema y lo resolví probablemente no de la mejor manera, pero funciona. Reemplacé todos los saltos de línea antes de hacer mi verdadera combinación:

 mystring= Regex.Replace(mystring, "\r\n", "") 

Estoy manipulando HTML, así que los saltos de línea realmente no me importan en este caso.

Probé todas las sugerencias anteriores sin suerte, estoy usando .Net 3.5 FYI

Quería unir un bloque particular en java

  ... ... if(isTrue){ doAction(); } ... ... } 

Si uso el regExp

 if \(isTrue(.|\n)*} 

incluía la llave de cierre para el bloque de método, así que usé

 if \(!isTrue([^}.]|\n)*} 

excluir el corchete de cierre de la coincidencia de comodín.

A menudo tenemos que modificar una subcadena con algunas palabras clave repartidas entre las líneas que preceden a la subcadena. Considere un elemento xml:

  21 Architectural design 81  

Supongamos que queremos modificar el 81, a algún otro valor, digamos 40. Primero identifique .UID.21..UID. , omita todos los caracteres, incluidos \n hasta .PercentCompleted. . El patrón de expresión regular y la especificación de reemplazo son:

 String hw = new String("\n 21\n Architectural design\n 81\n"); String pattern = new String ("(21)((.|\n)*?)()(\\d+)()"); String replaceSpec = new String ("$1$2$440$6"); //note that the group () is $4 and the group ((.|\n)*?) is $2. String iw = hw.replaceFirst(pattern, replaceSpec); System.out.println(iw);  21 Architectural design 40  

El subgrupo (.|\n) probablemente sea el grupo que falta $3 . Si hacemos que no sea capturado por (?:.|\n) entonces los $3 son () . Entonces, el patrón y replaceSpec también pueden ser:

 pattern = new String("(21)((?:.|\n)*?)()(\\d+)()"); replaceSpec = new String("$1$2$340$5") 

y el reemplazo funciona correctamente como antes.

en general . no coincide con las nuevas líneas, entonces intente ((.|\n)*)