3

我不知道为什么除了使用此正则表达式的输入之外还有 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

我只希望捕获AD是否以连字符开头。这段代码是可用的,我可以简单地忽略第二场比赛,但我想知道它为什么在那里。我只能假设它与我的两个捕获组有关。我的错误在哪里?

4

3 回答 3

8

是的,您得到两个捕获,因为您的正则表达式中有两个捕获组。

为避免不必要的捕获,您可以使用非捕获组(?:...)

/_(\d(?:-\d){0,3})\./
于 2012-04-07T15:08:38.673 回答
1

我只能假设它与我的两个捕获组有关。

你的假设是正确的

我的错误在哪里?

没有错误,一切都按预期运行。

于 2012-04-07T15:09:52.693 回答
0

你必须在你的 RE 中分组,所以你得到 2 场比赛。有什么令人惊讶的?每对括号是一个组。

于 2012-04-07T15:08:19.090 回答