Beispiel: "Dies ist nur ein einfacher Satz".
Ich möchte jedes Zeichen zwischen "Dies ist" und "Satz" abgleichen. Zeilenumbrüche sollten ignoriert werden. Ich kann die richtige Syntax nicht herausfinden.
Beispiel: "Dies ist nur ein einfacher Satz".
Ich möchte jedes Zeichen zwischen "Dies ist" und "Satz" abgleichen. Zeilenumbrüche sollten ignoriert werden. Ich kann die richtige Syntax nicht herausfinden.
Antworten:
Zum Beispiel
(?<=This is)(.*)(?=sentence)
Ich habe Lookbehind (?<=)
und Look Ahead verwendet, (?=)
damit "Dies ist" und "Satz" nicht im Spiel enthalten sind. Dies liegt jedoch an Ihrem Anwendungsfall. Sie können auch einfach schreibenThis is(.*)sentence
.
Wichtig hierbei ist, dass Sie den "Dotall" -Modus Ihrer Regex-Engine aktivieren, damit die .
mit der Newline übereinstimmt. Wie Sie dies tun, hängt jedoch von Ihrer Regex-Engine ab.
Das nächste ist, wenn Sie .*
oder verwenden .*?
. Der erste ist gierig und stimmt bis zum letzten "Satz" in Ihrer Zeichenfolge überein, der zweite ist faul und stimmt bis zum nächsten "Satz" in Ihrer Zeichenfolge überein.
Aktualisieren
This is(?s)(.*)sentence
Wo das (? S) den Dotall-Modifikator aktiviert, wird die .
Übereinstimmung mit den Zeilenumbruchzeichen vorgenommen.
Update 2:
(?<=is \()(.*?)(?=\s*\))
stimmt mit Ihrem Beispiel überein "Dies ist ein (einfacher) Satz". Siehe hier auf Regexr
This is(?s)(.*)sentence
würde funktionieren?
Die Wiederbelebung dieser Frage, weil der reguläre Ausdruck in der akzeptierten Antwort mir nicht ganz richtig erscheint. Warum? weil
(?<=This is)(.*)(?=sentence)
passt auf my first sentence. This is my second
inThis is my first sentence. This is my second sentence.
Sie benötigen einen Lazy Quantifier zwischen den beiden Lookarounds. Das Hinzufügen von a ?
macht den Stern faul.
Dies entspricht dem, was Sie wollen:
(?<=This is).*?(?=sentence)
Siehe Demo . Ich habe die Erfassungsgruppe entfernt, die nicht benötigt wurde.
DOTALL-Modus zur Anpassung über Zeilenumbrüche hinweg
Beachten Sie, dass in der Demo der Modus "Punkt stimmt mit Zeilenumbrüchen überein" (auch bekannt als "Punkt-Alles" eingestellt ist (siehe DOTALL in verschiedenen Sprachen aktivieren ). In vielen Regex-Varianten können Sie es mit dem Online-Modifikator festlegen (?s)
und den Ausdruck in Folgendes umwandeln :
(?s)(?<=This is).*?(?=sentence)
Referenz
.*
und .*?
wird aber auch in meiner Antwort (dem Absatz vor "Update") erklärt. Ich glaube also nicht, dass meine Antwort falsch ist.
is incorrect
auf doesn't seem quite correct to me
... aufgeweicht. Ich hoffe, das lässt dich nicht zucken, wahrscheinlich nur einen Unterschied in der Wahrnehmung darüber, wie der reguläre Ausdruck für eine so verkehrsreiche Antwort aussehen sollte.
Versuchen Sie This is[\s\S]*sentence
, funktioniert in Javascript
[\s\S]*?
(auch genannt: nicht gierige Wildcard)
Diese:
This is (.*?) sentence
arbeitet in Javascript.
benutze das: (?<=beginningstringname)(.*\n?)(?=endstringname)
endstringname
Für den Fall, dass jemand in einem Jenkins-Kontext nach einem Beispiel dafür sucht. Es analysiert das build.log und wenn es eine Übereinstimmung findet, schlägt der Build mit der Übereinstimmung fehl.
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)
}
}
}
Sie können dies einfach verwenden: \This is .*? \sentence
In erhabenem Text schreiben Sie einfach die beiden Wörter, die Sie behalten möchten, zum Beispiel in Ihrem Fall
"Dies ist" und "Satz"
und du schreibst. * dazwischen
dh This is .* sentence
und das sollte dir gut tun
So habe ich es gemacht:
Das war für mich einfacher als zu versuchen, den spezifischen regulären Ausdruck herauszufinden, der notwendig ist.
int indexPictureData = result.IndexOf("-PictureData:");
int indexIdentity = result.IndexOf("-Identity:");
string returnValue = result.Remove(indexPictureData + 13);
returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); `
Ich bin hier auf meiner Suche nach Regex gelandet, um diese Drucksyntax zwischen print "string" in Python2 in alten Skripten mit: print ("string") für Python3 zu konvertieren. Funktioniert gut, andernfalls verwenden Sie 2to3.py für zusätzliche Konvertierungen. Hier ist meine Lösung für andere:
Probieren Sie es auf Regexr.com aus (funktioniert aus irgendeinem Grund nicht in NP ++):
find: (?<=print)( ')(.*)(')
replace: ('$2')
für Variablen:
(?<=print)( )(.*)(\n)
('$2')\n
für Label und Variable:
(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n
Wie ersetze ich alle print "string" in Python2 durch print ("string") für Python3?
Das hat bei mir funktioniert (ich verwende VS Code ):
zum:
This is just\na simple sentence
Verwenden:
This .+ sentence
RegEx, um mithilfe des Java-Ansatzes alles zwischen zwei Zeichenfolgen abzugleichen.
List<String> results = new ArrayList<>(); //For storing results
String example = "Code will save the world";
Verwenden wir Pattern- und Matcher-Objekte, um RegEx (. ?) * Zu verwenden .
Pattern p = Pattern.compile("Code "(.*?)" world"); //java.util.regex.Pattern;
Matcher m = p.matcher(example); //java.util.regex.Matcher;
Da Matcher möglicherweise mehr als eine Übereinstimmung enthält, müssen wir die Ergebnisse durchlaufen und speichern.
while(m.find()){ //Loop through all matches
results.add(m.group()); //Get value and store in collection.
}
Dieses Beispiel enthält nur das Wort "speichert das" , aber im größeren Text werden wahrscheinlich mehr Übereinstimmungen gefunden.