regex - 正则表达式初学者问题 - 找不到数字组合
问题描述
我正在使用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。为清楚起见已替换。
解决方案
原因是因为??
语法
说匹配如果可以但不喜欢
一个好的 rx 引擎说好的,然后
只需要在量化范围内停止,因此它不必匹配空格,因为??
.
您会注意到如果第 3 次有空间,
引擎将停止,因为它已满足最小值 (3) 并且它
不想匹配该空间。
在这个例子中看到(\d{2}\s??){3,4}
它只匹配这个
00 00 00
00
或
000000
00
它匹配的原因是
在 last 之前00000000
没有空格。出于这个原因,
它也将匹配。00
00 00 0000
当它是正则表达式中的最后一个子表达式时,这种 不匹配??
的偏好几乎总是导致不匹配。
所以引擎真的把它\d{2}\s??
看作是
量化的子表达式。它只会匹配 3 次,因为
在看到最后一个空格并满足最小
3 in之后??
强制它停止000000 00
{3,4}
如果可能,请避开这种情况。
推荐阅读
- javalite - 如何在 javalite db 迁移器中外部化用户名和密码?
- macos - applescript:如何复制真实文件而不是别名,但递归
- angular - 无法确定 location/x.component.ts 中的模块类 x 组件将 x 组件添加到 Ng 模块以修复它。角 4
- java - 在 Java 中将 Excel 列格式从数字更改为文本
- android - Android TextToSpeech#speak 分别读取整数
- css - 为什么 Firefox DOM 重新排序
- javascript - 加载选中的复选框并计算它们
- python - 在 python 3 中引用静态属性作为另一个静态属性的初始化
- java - OutOfMemoryError 读取具有大行的 174 Mb 文本文件
- javascript - 是否可以获取“npm run build”命令生成的静态文件并将这些文件转换回项目?