我正试图从一个相当简单的字符串中提取匹配项。在我的输入字符串中,一般模式为:s(definitely a number)e(maybe some characters)s...
示例输入:s1e1s2e2s3es4e4
预期匹配数组:[{1,1},{2,2},{3,''},{4,4}]
我试过:
/s('d)e(['d':]+)?/g
和得到[{1,1},{2,2},{3},{4,4}]
,这真的很接近,但我需要第三组中的空字符串。
我天真地尝试
/s('d)e(.*?)?/g
给了我[{1,''},{2,''},{3,''},{4,''}]
我宁愿告诉正则表达式匹配任何字符,而不是在第一个示例中使用字符类。
除了一个简单的工作解决方案外,解释一下我的误解也很好。
将preg_match_all
与PREG_PATTERN_ORDER
选项(默认选项)一起使用。然后,它不会遗漏与结果中任何内容都不匹配的可选组。
试试这个:
$pattern = '~s('d)e(['d':]*?(?=s'd|:|$))~';
现在,您的捕获组可以匹配一个空字符串,不再是可选的。
我添加了一个前瞻性检查,以检查在字符串后面或:
或末尾是否有另一个"s''d"。
编辑:由于"s"不允许出现在第二个捕获组中,您可以简单地写:
$pattern = '~s('d)e([^s]*)~';
我认为这个s('d)e('d|)
应该适用于您的示例。我不知道结肠是干什么用的。