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.


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


@ 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


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


Wie führe ich auf diese Weise eine faule Suche durch?
AGamePlayer

4
@AwQiruiGuo wie oben. [\s\S]*?(auch genannt: nicht gierige Wildcard)
phil294


13

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


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


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


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); ` 

0

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


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?


0

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

zum: This is just\na simple sentence

Verwenden: This .+ sentence


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.