我不知道为什么在使用这个正则表达式的输入中找到了2个匹配项,当我预期只有1个匹配时。
preg_match(/_(\d(-\d){0,3})\./,$str,$matches);
使用此文件字符串格式name_A-B-C-D.ext
。
我希望得到像这样的单一比赛:
Example A
[0] => name_A-B-C-D.ext
[1] => A-B-C-D
Example B
[0] => name_A-B-C.ext
[1] => A-B-C
但这是我得到的结果:
Example A
[0] => name_A-B-C-D.ext
[1] => A-B-C-D
[2] => -D
Example B
[0] => name_A-B-C.ext
[1] => A-B-C
[2] => -C
如果A
之前带有连字符,我只希望将D
捕获到{{1}}。
这段代码是可用的,我可以简单地忽略第二场比赛,但我想知道为什么它在那里。我只能假设它与我的两个捕获组有关。我的错误在哪里?
答案 0 :(得分:8)
是的,你得到两次捕获,因为正则表达式中有两个捕获组。
为避免不必要的捕获,您可以使用非捕获组(?:...)
:
/_(\d(?:-\d){0,3})\./
答案 1 :(得分:1)
我只能假设它与我的两个捕获组有关。
你的假设是正确的
我的错误在哪里?
没有错误,一切都按预期行事。
答案 2 :(得分:0)
您必须在RE中进行分组,才能获得2场比赛。有什么令人惊讶的? 每对括号都是一组。