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.
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.
Risposte:
Per esempio
(?<=This is)(.*)(?=sentence)
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
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
This is(?s)(.*)sentence
funzionerebbe?
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 second
aThis is my first sentence. This is my second sentence.
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
.*
e .*?
è anche spiegata nella mia risposta (il paragrafo prima di "Aggiornamento"). Quindi non penso che la mia risposta sia errata.
is incorrect
a 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.
Prova This is[\s\S]*sentence
, funziona in javascript
[\s\S]*?
(chiamato anche: jolly non avido)
Questo:
This is (.*?) sentence
funziona in javascript.
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)
}
}
}
Puoi semplicemente usare questo: \This is .*? \sentence
Questo ha funzionato per me (sto usando VS Code ):
per:
This is just\na simple sentence
Uso:
This .+ sentence
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
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); `
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?
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.