ruby - regular - Regex, ¿cómo hacer coincidir varias líneas?
ruby regex match (5)
Puede usar el modificador /m
para habilitar el modo multilínea (es decir, para permitir que coincida con las líneas nuevas), y puede usarlo ?
para realizar un emparejamiento no codicioso:
message = <<-MSG
Random Line 1
Random Line 2
From: [email protected]
Date: 01-01-2011
To: [email protected]
Subject: This is the subject line
Random Line 3
Random Line 4
MSG
message.match(/(From:.*Subject.*?)/n/m)[1]
=> "From: [email protected]/nDate: 01-01-2011/nTo: [email protected]/nSubject: This is the subject line"
Consulte http://ruby-doc.org/core/Regexp.html y busque "modo multilínea" y "codicioso de forma predeterminada".
Estoy tratando de hacer coincidir la línea From
todo el camino hasta el final de la línea Subject
en lo siguiente:
....
From: XXXXXX
Date: Tue, 8 Mar 2011 10:52:42 -0800
To: XXXXXXX
Subject: XXXXXXX
....
Hasta ahora tengo:
/From:.*Date:.*To:.*Subject/m
Pero eso no coincide con el final de la línea de asunto. Traté de agregar $
pero eso no tuvo ningún efecto.
Si desea hacer coincidir los saltos de línea, una posibilidad es reemplazar primero todos los caracteres de nueva línea con algún otro carácter (o secuencia de caracteres) que de otro modo no aparecería en el texto. Por ejemplo, si tiene todo el texto en una variable de cadena, puede hacer algo como aString.split("/n").join("|")
para reemplazar todas las líneas nuevas con caracteres de tubería.
Además, observe la respuesta de Alan Moore a su pregunta anterior sobre cómo hacer coincidir el carácter de nueva línea en una expresión regular.
Si está usando ruby, puede intentar:
Regexp.new("some reg", Regexp::MULTILINE)
Si no estás usando ruby, te sugiero que hackes esta pregunta:
- reemplace todo el "/ n" con SOME_SPECIAL_TOKEN
- busca la expresión regular y realiza otras operaciones ...
- restaurar: reemplaza SOME_SPECIAL_TOKEN con "/ n"
Tratar:
/...^Subject:[^/n]*/m
Usando los siguientes datos:
From: XXXXXX
Date: Tue, 8 Mar 2011 10:52:42 -0800
To: XXXXXXX
Subject: XXXXXXX
La siguiente expresión regular hará la magia:
From:([^/r/n]+)[/r/n]+Date:([^/r/n]+)[/r/n]+To:([^/r/n]+)[/r/n]+Subject:([^/r/n]+)[/r/n]+
Pero recomendaría que no intentes hacer esto en 1 expresión regular. Presione en una expresión regular "^ (/ w +): (. +) $" Línea por línea, a menos que esté seguro de que la secuencia de FROM / DATE / TO / SUBJECT no va a cambiar;)