我有一个字符串,我需要从中捕获一个,可能还有两个子字符串(使用PHP):
我无法让我的模式捕获第二个模式,除非我在模式字符串中强制它。如果主体中只有第一个模式可用,则会导致模式失败。
我很难过。这不应该那么难。
<?php
// sometimes the subject looks like this:
//$subject = 'pattern 111 -then some random junk-';
$subject = 'pattern 111 -then some random junk- pattern 222';
preg_match('/(pattern 111)(.*?)(pattern 222)?/', $subject, $matches);
print_r($matches);
?>
这是我从上面得到的:
Array
(
[0] => pattern 111
[1] => pattern 111
[2] =>
)
似乎归结为如何使{0,1}(即模式中的最终?运算符)更加贪婪(具有讽刺意味的是,作为量词修饰符,它会做相反的事情)
答案 0 :(得分:4)
在这里试试
(pattern 111)(?:.*(pattern 222))?
我使第二组成为非捕获组,因此你有两个捕获组,第一组包含必需部分,第二组包含可选部分。
最后将惰性量词与可选部分组合起来是行不通的,但如果缺少可选部分,则无需匹配强制模式后的部分,因此只需将未知垃圾包含在可选部分中一部分。