2016-07-24 12 views
4

Betrachten Sie den folgenden Text:Warum macht meine Regex das?

foo:·····¶ 
·bar x··¶ 
·lorem ipsum····¶ 
dolorsitamet···¶ 
···¶ 
consectetur adipiscing elit: 

Wo mittleren Punkte Räume zeigen und eine neue Zeile anzeigt.

Der Regex (?:foo:\s*)(.+)(?:\n\s*) stimmt mit den drei Leerzeichen auf der Leerraumzeile überein, aber der Regex (?:foo:\s*)(.+)(?:\n\s+) stimmt mit dem Zeilenumbruch und nicht mit dem Zeilenumbruch überein, der auf dolorsitamet folgt. Warum verhält sich der * Charakter nicht gierig? Man würde erwarten, dass die dritte Gruppe (?:\n\s*)

¶ 
···¶` 

Mein regex Modus ist mehrzeilige, dotall anzupassen.

Antwort

1

Gierige Natur ist nicht das Problem hier. Probleme, wenn Sie verwenden:

\n\s* 

Und da .+ bevor diese gierig ist, \n\s* Streichhölzer allerletzten \n in Eingabetext heißt (last-1)th Linie (d Linie mit 3 Raum) und stoppt.

RegEx Demo 1

Wenn Sie jedoch

\n\s+ 

Durch Anwesenheit von + quantifier verwenden, erfordert es mindestens ein Leerzeichen nach \n daher kann es nicht \n in (last-1)th Linie entsprechen (seit dem letzten Zeile hat am Anfang keine Leerzeichen. Daher entspricht es \n in der Zeile beginnend mit dolorsitamet als nächste Zeile hat Leerzeichen beim Start.

RegEx Demo 2

+0

Ja, ich bin Regex101 mit dem regex Handwerk. Was ich eigentlich will, ist, dass es alles zwischen 'foo: ···· ¶' und dem Leerzeichen nach' dolorsitamet ··· '(Ich kümmere mich nicht um nachgestellte Leerzeichen, aber keine Zeilenumbrüche), aber es sollte auch zurückgeben, was es derzeit für den Text hier tut https://regex101.com/r/jZ5hU0/1. Was wäre der richtige Weg, um es anzupassen? –

+1

Nevermind, ich fand die Lösung '(?: Foo: \ s *) (. +?) ((?: $) | (?: \ N \ + \ n))' –

+0

Ein bisschen vereinfacht: ' (?: foo: \ s *) (. +?) (\ n \ s + \ n | $) ' – anubhava

1

Es verhält sich gierig. Um jedoch am Ende \n\s+ zu entsprechen, muss ein Zeilenvorschubzeichen gefolgt von mindestens einem Leerzeichen eingegeben werden. In diesem Fall sind das der vorletzte Zeilenumbruch, die drei Leerzeichen und der letzte Zeilenumbruch.

Wenn es dort nicht aufhört, wird die .+ mehr erfassen, aber der letzte Teil wird nicht übereinstimmen und die Regex-Engine wird nach einer weniger gierigen Lösung suchen, die es findet.

Verwandte Themen