Regex Ordne alle Zeichen zwei Zeichenfolgen zu

434

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.

0xbadf00d
quelle
11
Möglicherweise möchten Sie angeben, in welcher Umgebung Sie Regex verwenden. Je nachdem, was Sie unter "Ignorieren" von Zeilenumbrüchen verstehen, können Unterschiede auftreten.
Andrew Barber

Antworten:

645

Zum Beispiel

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

Regexr

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

Regexr

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

Stema
quelle
@ tchrist, sorry ich musste das nachschlagen. Verstehe ich das richtig und This is(?s)(.*)sentencewürde funktionieren?
Stema
@stema: Ja, das sollte funktionieren, um den "Punkt alle" -Modus unter den meisten Regex-Bibliotheken zu aktivieren.
Tchrist
1
Das hat mein Problem größtenteils gelöst, aber wie füge ich ein Leerzeichen in mein Muster ein? Ich habe Folgendes versucht: "(. *?) ())", Um mit dem ")" am Ende einer Sequenz übereinzustimmen, aber es hat nicht funktioniert.
0xbadf00d
27
Nur eine Anmerkung - Regexr sagt jetzt, dass Lookbehind in Javascript nicht unterstützt wird
Kovo
2
Gibt es eine Möglichkeit, mit wiederholten Instanzen dieser Aufteilung in einem Textblock umzugehen? Zum Beispiel: "Dies ist nur ein einfacher Satz. Hier sind einige zusätzliche Dinge. Dies ist nur ein einfacher Satz. Und hier sind einige weitere Dinge. Dies ist nur ein einfacher Satz." Derzeit entspricht es der gesamten Zeichenfolge und nicht jeder Instanz.
Jzadra
181

Lazy Quantifier benötigt

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 secondinThis is my first sentence. This is my second sentence.

Siehe Demo .

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

zx81
quelle
Sie haben Recht mit der Erfassungsgruppe. Ich weiß nicht, warum ich das getan habe. Der Unterschied zwischen .*und .*?wird aber auch in meiner Antwort (dem Absatz vor "Update") erklärt. Ich glaube also nicht, dass meine Antwort falsch ist.
Stema
2
@stema Tut mir leid wegen des Nitpicking, als ich gestern einige deiner Antworten durchgesehen habe, das ist das einzige, das mich zum Zucken gebracht hat. :) Ich habe die erste Zeile von is incorrectauf 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.
zx81
39

Versuchen Sie This is[\s\S]*sentence, funktioniert in Javascript

Kaore
quelle
Wie führe ich auf diese Weise eine faule Suche durch?
AGamePlayer
4
@AwQiruiGuo wie oben. [\s\S]*?(auch genannt: nicht gierige Wildcard)
phil294
16

Diese:

This is (.*?) sentence

arbeitet in Javascript.

Riyafa Abdul Hameed
quelle
13

benutze das: (?<=beginningstringname)(.*\n?)(?=endstringname)

Vignesh
quelle
Ich weiß nicht, warum alle Stimmen stimmen, dies ermöglicht 0-1 Zeilenumbrüche, und der Zeilenumbruch muss unmittelbar vorendstringname
OGHaza
Ich fand es nützlich, den Anfang von Protokollzeilen (Zeitstempel usw.) zu entfernen. Ich habe eine neue Zeile für die Anfangszeichenfolge und "at" für die Endzeichenfolge verwendet.
Stan
2

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)
        }
    }
}
Cephos
quelle
1

Sie können dies einfach verwenden: \This is .*? \sentence

AnirbanDebnath
quelle
0

Erhabener Text 3x

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

rsc05
quelle
Ich bin mir nicht sicher, ob die Frage lautet, wie dies in Sublime Text gemacht werden soll, funktioniert aber meistens in Sublime Text. Es funktioniert nicht, wenn zwischen "Dies ist" und "Satz" ein Zeilenumbruch auftritt. Außerdem wählt erhabener Text auch "Dies ist" und "Satz" aus und nicht nur den Text zwischen diesen beiden Zeichenfolgen.
Dylan Kinnett
0

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); ` 
Bbb
quelle
0

Für eine schnelle Suche in VIM können Sie an der Vim Control-Eingabeaufforderung Folgendes verwenden: / Dies ist. * \ _. * Satz

Vins
quelle
0

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?

Alchimie
quelle
0

Das hat bei mir funktioniert (ich verwende VS Code ):

zum: This is just\na simple sentence

Verwenden: This .+ sentence

Roshna Omer
quelle
0

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.

Alexander
quelle