Regex Abbina tutti i caratteri tra due stringhe


436

Esempio: "Questa è solo una semplice frase".

Voglio abbinare ogni personaggio tra "Questo è" e "frase". Le interruzioni di riga devono essere ignorate. Non riesco a capire la sintassi corretta.


11
Potresti voler indicare in quale ambiente stai usando Regex. Potrebbero esserci delle differenze a seconda di cosa esattamente intendi con "ignora" le interruzioni di riga.
Andrew Barber,

Risposte:


647

Per esempio

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

RegExr

Ho usato lookbehind (?<=)e guardare avanti in (?=)modo che "This is" e "frase" non siano inclusi nella partita, ma 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 .corrisponda alla nuova riga. Ma come lo fai dipende dal tuo motore regex.

La prossima cosa è se usi .*o .*?. Il primo è avido e corrisponderà fino all'ultima "frase" nella tua stringa, il secondo è pigro e corrisponderà fino alla prossima "frase" nella tua stringa.

Aggiornare

RegExr

This is(?s)(.*)sentence

Dove (? S) attiva il modificatore dotall, facendo .corrispondere i caratteri di nuova riga.

Aggiornamento 2:

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

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


@tristo, scusa se ho dovuto cercare questo. Lo capisco correttamente e This is(?s)(.*)sentencefunzionerebbe?
Stema,

@stema: Sì, dovrebbe funzionare per abilitare la modalità "dot all" nella maggior parte delle librerie regex.
tchrist,

1
Ciò ha risolto principalmente il mio problema, ma come posso includere un carattere di spazio bianco nel mio modello? Ho provato quanto segue: "(. *?) ())" Per abbinare il ")" alla fine di una sequenza, ma non ha funzionato.
0xbadf00d,

28
Solo una nota - regexr dice ora che lookbehind non è supportato in javascript
Kovo

2
C'è un modo per gestire le ripetute istanze di questa divisione in un blocco di testo? Per esempio: "Questa è solo una frase semplice. Ecco alcune cose aggiuntive. Questa è solo una frase semplice. Ed ecco alcune altre cose. Questa è solo una frase semplice". Attualmente corrisponde all'intera stringa, anziché a ciascuna istanza.
jzadra,

182

Necessario quantificatore pigro

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

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

corrisponderà my first sentence. This is my secondaThis is my first sentence. This is my second sentence.

Vedi la demo .

Hai bisogno di un quantificatore pigro tra i due lookaround. L'aggiunta di a ?rende la stella pigra.

Questo corrisponde a quello che vuoi:

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

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

Modalità DOTALL per abbinare le interruzioni di linea

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

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

Riferimento


Hai ragione sul gruppo di acquisizione. Non so perché l'ho fatto. Ma la differenza tra .*e .*?è anche spiegata nella mia risposta (il paragrafo prima di "Aggiornamento"). Quindi non penso che la mia risposta sia errata.
Stema,

2
@stema Mi dispiace per il nitpicking, mentre ieri ho sfogliato alcune delle tue risposte che è l'unica che mi ha fatto contrarre. :) mollai la prima linea da is incorrecta doesn't seem quite correct to me... Spero che non ti si contrazione, probabilmente solo una differenza di percezione di ciò che la regex per una tale risposta ad alto traffico dovrebbe essere.
zx81,

39

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


come eseguire una ricerca pigra in questo modo?
AGamePlayer

4
@AwQiruiGuo come sopra. [\s\S]*?(chiamato anche: jolly non avido)
phil294


13

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


Non so perché tutti i voti endstringname
positivi

Ho trovato utile rimuovere l'inizio delle righe del registro (timestamp ecc.). Ho usato una nuova riga per la stringa iniziale e "at" per la stringa finale.
Stan,

2

Nel caso in cui qualcuno stia cercando un esempio di questo in un contesto Jenkins. Analizza build.log e se trova una corrispondenza fallisce la compilazione 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)
        }
    }
}


1

Questo ha funzionato per me (sto usando VS Code ):

per: This is just\na simple sentence

Uso: This .+ sentence


0

Testo sublime 3x

Nel testo sublime, scrivi semplicemente le due parole che sei interessato a conservare, ad esempio nel tuo caso

"Questo è" e "frase"

e scrivi. * in mezzo

vale a dire This is .* sentence

e questo dovrebbe farti bene


Non sono sicuro che la domanda sia su come farlo in Sublime Text ma funziona principalmente in Sublime Text. Non funziona in caso di interruzione di riga tra "Questo è" e "frase". Inoltre, il testo sublime seleziona anche "Questo è" e "Frase" anziché solo il testo tra queste due stringhe.
Dylan Kinnett,

0

Ecco come l'ho fatto:
per me è stato più semplice 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); ` 

0

per una rapida ricerca in VIM, è possibile utilizzare al prompt di Vim Control: / Questa è la frase. * \ _. *


0

Sono arrivato qui sulla mia ricerca di regex per convertire questa sintassi di stampa tra "stringa" di stampa, in Python2 in vecchi script con: print ("stringa"), per Python3. Funziona bene, altrimenti usa 2to3.py per ulteriori conversioni. Ecco la mia soluzione per gli altri:

Provalo su Regexr.com (non funziona in NP ++ per qualche motivo):

find:     (?<=print)( ')(.*)(')
replace: ('$2')

per variabili:

(?<=print)( )(.*)(\n)
('$2')\n

per etichetta e variabile:

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n

Come sostituire tutta la "stringa" di stampa in Python2 con print ("stringa") per Python3?


0

RegEx per abbinare tutto tra due stringhe usando l'approccio Java.

List<String> results = new ArrayList<>(); //For storing results
String example = "Code will save the world";

Usiamo gli oggetti Pattern e Matcher per usare RegEx (. ?) * .

Pattern p = Pattern.compile("Code "(.*?)" world");   //java.util.regex.Pattern;
Matcher m = p.matcher(example);                      //java.util.regex.Matcher;

Poiché Matcher potrebbe contenere più di una corrispondenza, è necessario eseguire il ciclo dei risultati e memorizzarli.

while(m.find()){   //Loop through all matches
   results.add(m.group()); //Get value and store in collection.
}

Questo esempio conterrà solo "salverà" la parola, ma nel testo più grande probabilmente troverà più corrispondenze.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.