Regex Abbina tutti i personaggi tra due stringhe

Esempio: “Questa è solo una semplice frase”.

Voglio abbinare ogni carattere tra “Questo è” e “frase”. Le interruzioni di riga dovrebbero essere ignorate. Non riesco a capire la syntax corretta.

Per esempio

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

RegExr

Ho usato lookbehind (?< =) E guardo avanti (?=) modo che "This is" e "sentence" non sono inclusi nella partita, ma questo dipende dal tuo caso d'uso, puoi anche semplicemente scrivere This is(.*)sentence .

La cosa importante qui è che attivi la modalità "dotall" del tuo motore regex, in modo che il . corrisponde alla nuova riga. Ma come lo fai dipende dal tuo motore regex.

La prossima cosa è se usi .* O. .*? . Il primo è avido e si abbina fino all'ultima "frase" nella tua stringa, il secondo è pigro e combacia fino alla successiva "frase" nella tua stringa.

Aggiornare

RegExr

 This is(?s)(.*)sentence 

Dove il (? S) triggers il modificatore dotall, creando il . abbinare i caratteri di nuova riga.

Aggiornamento 2:

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

corrisponde al tuo esempio "Questa è una (semplice) frase". Vedi qui su Regexr

Quantificatore pigro necessario

Risuscitare questa domanda perché la regex nella risposta accettata non mi sembra del tutto corretta. Perché? Perché

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

corrisponderà alla my first sentence. This is my second my first sentence. This is my second in This is my first sentence. This is my second sentence. This is my first sentence. This is my second sentence.

Guarda la demo .

Hai bisogno di un quantificatore pigro tra i due lookaround. Aggiungere un ? rende la stella pigra.

Questo corrisponde a ciò che desideri:

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

Guarda la demo . Ho rimosso il gruppo di acquisizione, che non era necessario.

Modalità DOTALL da abbinare alle interruzioni di linea

Si noti che nella demo viene impostato "punto corrisponde alla modalità interruzioni di riga" (noto anche come punto-tutto) (vedere come triggersre DOTALL in varie lingue ). In molti sapori regex, puoi impostarlo con il modificatore online (?s) , trasformando l'espressione in:

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

Riferimento

  • I molti gradi dell'avidità del Regex
  • Ripetizione con Star e Plus

Prova This is[\s\S]*sentence , funziona in javascript

Questo:

 This is (.*?) sentence 

funziona in javascript.

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

Puoi semplicemente usare questo: \This is .*? \sentence \This is .*? \sentence

Nel caso qualcuno stia cercando un esempio di questo all’interno di un contesto Jenkins. Analizza il build.log e se trova una corrispondenza fallisce la build con la corrispondenza.

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

Testo sublime 3x

Nel testo sublime, scrivi semplicemente le due parole che ti interessa tenere per esempio nel tuo caso lo è

“Questo è” e “frase”

e tu scrivi * in mezzo

cioè This is .* sentence

e questo dovrebbe farti bene

Ecco come l’ho fatto:
Per me è stato più facile che cercare di capire la regex specifica necessaria.

 int indexPictureData = result.IndexOf("-PictureData:"); int indexIdentity = result.IndexOf("-Identity:"); string returnValue = result.Remove(indexPictureData + 13); returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); ` 

per una rapida ricerca in VIM, è ansible utilizzare al prompt di Vim Control: / This is. * \ _. * sentence