2012-04-11 13 views
1

Ich versuche ein wenig über Regex zu lernen, kann mir jemand erklären, was hier vor sich geht? Und geben Sie ein Beispiel für eine Regex, die die erwartete Ausgabe liefern würde? Vielen Dank!Warum funktioniert diese gierige Regex nicht wie erwartet?

input data = 'Sometext|even more text' 

regex = '(.*)?\|?.*' 

replacement = '$1' 

expected output = 'Sometext' 

actual output = 'Sometext|even more text' 

PHP

preg_filter("(.*)?\|?.*", "$1", 'Sometext|even more text'); // returns Sometext|even more text 
+1

Bitte fügen Sie auch PHP-Code hinzu. – hakre

+0

'\ |?' Macht auch den vertikalen Balken optional. – nickb

Antwort

1

(.*) ist gierig, so dass alles passt. $1 ist dann alles.

Sie suchen wahrscheinlich für:

/^([^|]*).*$/ 
+0

Und wie würde ein nicht gieriger (. *) Aussehen? – netbrain

+1

@netbrain: '(. *?)' Aber es ist besser, den Operator für alle Übereinstimmungen zu vermeiden und stattdessen Zeichen auszuschließen, die nicht übereinstimmen sollen, wie @hakre. –

+1

Sie machen es nicht gierig, indem Sie ein '?' Hinzufügen. Allerdings habe ich die Antwort bearbeitet, weil Sie nicht verstehen wollen, sondern nur Code haben;) – hakre

1

Ihre regex „durch eine optionale |, gefolgt von 0 oder mehr Zeichen alle Zeichen, gefolgt“ sagt.

Ändern Sie die ursprüngliche (.*) zu ([^\|]*), oder machen Sie die | nicht optional.

1

* ist gierig, was bedeutet, dass es versuchen wird, so viel Text wie möglich zu finden. In diesem Fall:

  • (.*)? werden alle den Text passen
  • \|?.* passt auf den "Rest" (leere Zeichenkette)

Versuch: regex = '\|[^|]*', replacement = ''

1

Wenn Sie Ihre Regex (\w+)?\|?.* ändern , speziell die + nach der \w hinzufügen, dann erhalten Sie Ihre erwartete Antwort von 'Sometext'.

Der Grund, warum Sie die ganze Zeichenfolge übereinstimmten, ist, dass die erste .* die gesamte Zeichenfolge übereinstimmte. Mit den Änderungen, die ich oben habe, werden Sie bei jedem Wort Zeichen zusammenpassen.

Verwandte Themen