首页 > 解决方案 > 正则表达式初学者问题 - 找不到数字组合

问题描述

我正在使用RegexPal来交叉检查我的正则表达式。

我正在尝试从文本中提取电话号码。德国电话号码通常具有以下格式之一:

0 0000 000000
+49 0000 000000
00000 000000
+490000 000000
00000/000000
+490000/000000
0000 - 00 00 00 00
+49000 - 00 00 00 00
0000 - 00000000
+49000 - 00000000

我已经构建了以下 RegEx 来测试电话号码

/([+]??\d{2}|[0])[\s/-]??\d{3,4}([\s/-]|(\s-\s))??(\d{2}\s??){3,4}/g

最后两个布局被检测到,而倒数第二个则没有。谁能给我解释一下?具体来说,最后一个空格出于某种原因删除了最后一对。

编辑:

00 00 00 00 vs
00000000

使用这个正则表达式:

(\d{2}\s??){3,4}

最后一个被检测到,第一个没有。

编辑 2:使用 (+49|0) 我的意思是 +49 或 0。为清楚起见已替换。

标签: regex

解决方案


原因是因为??语法
说匹配如果可以但不喜欢

一个好的 rx 引擎说好的,然后
只需要在量化范围内停止,因此它不必匹配空格,因为??.

您会注意到如果第 3 次有空间,
引擎将停止,因为它已满足最小值 (3) 并且它
不想匹配该空间。

在这个例子中看到(\d{2}\s??){3,4}它只匹配这个
00 00 0000

00000000

演示1

它匹配的原因是 在 last 之前00000000没有空格。出于这个原因, 它也将匹配。
00
00 00 0000


当它是正则表达式中的最后一个子表达式时,这种 不匹配??的偏好几乎总是导致不匹配。

所以引擎真的把它\d{2}\s??看作是
量化的子表达式。它只会匹配 3 次,因为 在看到最后一个空格并满足最小 3 in之后??强制它停止
000000 00
{3,4}

如果可能,请避开这种情况。


推荐阅读