我试图从一个相当简单的字符串中拉出匹配。在我的输入字符串中,常规模式为: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,''}]
我宁愿告诉正则表达式匹配任何字符,而不是在第一个例子中使用字符类。
除了一个简单的工作解决方案之外,对我的误解的解释也会很棒。
答案 0 :(得分:2)
将preg_match_all
与PREG_PATTERN_ORDER
选项一起使用(默认设置)。然后它不会遗漏与结果中的任何内容都不匹配的可选组。
答案 1 :(得分:1)
试试这个:
$pattern = '~s(\d)e([\d\:]*?(?=s\d|:|$))~';
现在你的捕获组可以匹配一个空字符串,不再是可选的。
我添加了一个预测,以检查是否有另一个“s \ d”或:
或字符串结尾。
编辑:由于第二个捕获组中不允许使用“s”,因此您只需编写:
$pattern = '~s(\d)e([^s]*)~';
答案 2 :(得分:0)
我认为这个s(\d)e(\d|)
应该适用于您的示例。我不知道结肠是为了什么。