我尝试在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
看起来你忘了行输出的。 – Chriszuma
另外,你能用文字解释你试图捕捉什么吗?这不是很明显。 – Chriszuma
@Chriszuma第二个正则表达式与第二个字符串不匹配,因为该字符串中不存在“cd:”。 – bloodphp