it-swarm.com.de

Regex Stimmt mit allen Zeichen zwischen zwei Zeichenfolgen überein

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 korrekte Syntax nicht herausfinden.

319
0xbadf00d

Zum Beispiel

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

Regexr

Ich habe lookbehind (?<=) verwendet und vorausschauend (?=), so dass "Dies ist" und "Satz" nicht im Match enthalten sind. Dies ist jedoch abhängig von Ihrem Anwendungsfall. Sie können auch einfach This is(.*)sentence schreiben.

Das Wichtigste dabei ist, dass Sie den "Dotall" -Modus Ihrer Regex-Engine aktivieren, sodass der . mit dem Zeilenvorschub übereinstimmt. Wie Sie dies tun, hängt jedoch von Ihrer Regex-Engine ab.

Als nächstes verwenden Sie .* oder .*?. Der erste ist gierig und wird bis zum letzten "Satz" in Ihrer Zeichenfolge passen, der zweite ist faul und wird bis zum nächsten "Satz" in Ihrer Zeichenfolge übereinstimmen.

Update

Regexr

This is(?s)(.*)sentence

Wo die (? S) den Dotall-Modifikator einschalten, wird der . mit den Zeilenumbrüchen übereinstimmen.

Update 2:

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

passt zu Ihrem Beispiel "Dies ist ein (einfacher) Satz". Siehe hier auf Regexr

476
stema

Lazy Quantifier benötigt

Diese Frage wieder aufleben lassen, weil mir der Regex in der akzeptierten Antwort nicht ganz richtig erscheint. Warum? weil

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

wird mit my first sentence. This is my second in This is my first sentence. This is my second sentence. übereinstimmen 

Siehe Demo

Sie brauchen einen trägen Quantifizierer zwischen den beiden Lookarounds. Das Hinzufügen eines ? macht den Stern faul. 

Das entspricht was Sie wollen:

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

Siehe Demo . Ich habe die Erfassungsgruppe entfernt, die nicht benötigt wurde. 

DOTALL-Modus zur Anpassung an Zeilenumbrüche

Beachten Sie, dass in der Demo der Punkt "Punkt entspricht Zeilenumbruch" (a.k.a.) dot-all gesetzt ist (siehe wie man DOTALL in verschiedenen Sprachen einschaltet ). In vielen Regex-Varianten können Sie es mit dem Online-Modifizierer (?s) einstellen.

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

Referenz

135
zx81

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

32
kaore

Diese:

This is (.*?) sentence

funktioniert in Javascript.

14

verwenden Sie dies: (?<=beginningstringname)(.*\n?)(?=endstringname)

13
vignesh

Falls jemand nach einem Beispiel in einem Jenkins-Kontext 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)
        }
    }
}
1
Cephos

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

1
AnirbanDebnath

Ich bin hier auf meiner Suche nach Regex gekommen, um diese Drucksyntax zwischen print "string", in Python2 in alten Skripts mit: print ("string") für Python3 zu konvertieren. Funktioniert gut, verwenden Sie andernfalls 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 kann ich "print" in Python2 durch "print" ("string") für Python3 ersetzen?

0
alchemy

Erhabener Text 3x

In erhabenem Text schreiben Sie einfach das Wort, an dem Sie interessiert sind, zum Beispiel in Ihrem Fall, dass es so ist

"Dies ist" und "Satz"

und du schreibst. * dazwischen

d.h. This is .* sentence

und das sollte dir gut tun

0
rsc05

für eine schnelle Suche in VIM können Sie bei Vim Control Prompt:/verwenden

0
vins

RegEx, um alles zwischen zwei Zeichenfolgen mit dem Java-Ansatz 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 "speichert das" Word, aber im größeren Text werden wahrscheinlich mehr Übereinstimmungen gefunden.

0
Alexander

Das hat für mich funktioniert (ich benutze VS Code )

für: This is just\na simple sentence

Verwenden Sie: This .+ sentence

0
Roshna Omer

So habe ich es gemacht:
Dies war für mich einfacher, als den spezifischen Regex zu ermitteln, 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
Bbb