/ / Regex stimmt mit dem letzten Vorkommen von beiden Schlüsselwörtern überein - regex, preg-match

Regex passt alles ab dem letzten Vorkommen von beiden Schlüsselwörtern an - regex, preg-match

Ich versuche, alles vom letzten Vorkommen eines Schlüsselworts (foo oder bar) bis zum Ende des Strings abzustimmen.

Beispiel (a):

// I want to match " foo do you?";
$source = "This is foo and this is bar i like foo do you?";
$pattern = "/pattern/";
preg_match($pattern, $source, $matches);

Ich habe Folgendes versucht:

$pattern = "/( (foo|bar) .*)$/";

Ich denke, es würde dem letzten Vorkommen von foo und der gesamte folgende Text, aber es entspricht dem ersten Vorkommen.

print_r($matches);

/*
Array
(
[0] =>  foo and this is bar i like foo do you?
[1] =>  foo and this is bar i like foo do you?
[2] => foo
)
*/

Hinweis Ich mache mir Gedanken über die Theorie und die Argumentation, wie das zu machen ist. Bitte fügen Sie bitte eine Erklärung oder einen Link zu der entsprechenden Erklärung hinzu.

Antworten:

3 für die Antwort № 1
.+((foo|bar).+)$

. + trifft viele Charaktere im Vordergrund.

((foo | bar) vergleicht und erfasst Ihre Keywords).

. +) passt und erfasst viele Zeichen.

$ entspricht dem Ende der Zeichenfolge / Zeile.

Anhand Ihres Beispiels:

This is foo and this is bar i like foo do you?
^---------^

2 für die Antwort № 2

Benutze ein gieriges Streichholz, um so viel wie möglich von deinem Heuhaufen zu konsumieren:

>>> import re
>>> source = "This is foo and this is bar i like foo do you?"
>>> pattern = ".*((?:foo|bar).*)"
>>> re.search(pattern, source).groups()[0]
"foo do you?"

Eine gröbere Art, dies zu tun, ist, negative Vorausschau zu verwenden:

>>> # Negative look-ahead for the pattern: (?!.*(?:foo|bar))
>>> pattern = "((?:foo|bar)(?!.*(?:foo|bar)).*)"
>>> re.search(pattern, source).groups()[0]
"foo do you?"