[英]Regex doesn't match, greediness
我嘗試用PHP中的正則表達式將字符串的兩個部分匹配。 我認為貪婪存在問題。 我希望第一個正則表達式(請參見注釋)能夠為我提供前兩個捕獲,就像第二個正則表達式一樣,但仍然捕獲兩個字符串。 我究竟做錯了什么?
我正在嘗試獲取+123
(如果cd:
存在,如第一個字符串所示)和456
。
<?php
$data[] = 'longstring start waste cd:+123yz456z longstring';
$data[] = 'longstring start waste +yz456z longstring';
$regexs[] = '/start[^z]*?(cd:([^y]+)y)?[^z]*z([^z]*)z/'; // first
$regexs[] = '/start[^z]*?(cd:([^y]+)y)[^z]*z([^z]*)z/'; // second
foreach ($regexs as $regex) {
foreach ($data as $string) {
if (preg_match($regex, $string, $match)) {
echo "Tried '$regex' on '$string' and got " . implode(',', array_split($match, 1));
echo "\n";
}
}
}
?>
輸出為:
Tried '/start[^z]*?(cd:([^y]+)y)?[^z]*z([^z]*)z/' on 'longstring start waste cd:+123yz456z longstring' and got ,,456
Tried '/start[^z]*?(cd:([^y]+)y)?[^z]*z([^z]*)z/' on 'longstring start waste +yz456z longstring' and got ,,456
Tried '/start[^z]*?(cd:([^y]+)y)[^z]*z([^z]*)z/' on 'longstring start waste cd:+123yz456z longstring' and got cd:+123y,+123,456
由於第二個字符串中沒有cd:
所以沒有第四行。
預期輸出(因為我不是專家),其中第一行與實際輸出不同:
Tried '/start[^z]*?(cd:([^y]+)y)?[^z]*z([^z]*)z/' on 'longstring start waste cd:+123yz456z longstring' and got cd:+123y,+123,456
Tried '/start[^z]*?(cd:([^y]+)y)?[^z]*z([^z]*)z/' on 'longstring start waste +yz456z longstring' and got ,,456
Tried '/start[^z]*?(cd:([^y]+)y)[^z]*z([^z]*)z/' on 'longstring start waste cd:+123yz456z longstring' and got cd:+123y,+123,456
好的,如果有cd:
+123
捕獲+123
,並且始終為456
? 這是我的處理方式:
$data[] = 'longstring start waste cd:+123yz456z longstring';
$data[] = 'longstring start waste +yz456z longstring';
$regexs[] = '/start.+?(?:cd:(.+?)y)?.*?z(.+?)z/';
通過自由使用非貪婪( ?
)乘數,您可以使其完全按照您的要求進行。
另請注意(?:)
非捕獲組。 它們非常有用。
編輯顯然這不起作用,讓我們嘗試使用“或/或”組的另一種方法:
$regexs[] = '/start.+?(?:cd:(.+?)yz(.+?)z|\+yz(.+?)z)/';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.