我有一个从网站提取德国手机号码的正则表达式:
[^d]((+49|0049|0)1[567]d{1,2}([ -/]*d){7})(?!d)
正如你在演示中看到的,它工作得很好。唯一不匹配的模式是:
+49 915175461907
请在链接的演示中查看更多示例。问题是+49
后面的空白。
我需要如何改变当前的正则表达式模式,以匹配甚至这些类型的模式?
一个更好的正则表达式是:
(?<!d)(?:+49|0049|0) *[19][1567]d{1,2}(?:[ /-]*d){7,8}(?!d)
更新的RegEx Demo
变化:
(?<!d)
:确保前一个字符不是数字[19][1567]
:匹配1
或9
后面的[1567]
位{7,8}
:匹配给定结构的7或8个重复- 最好在字符类的第一个或最后一个位置保留一个未转义的连字符
- 使用非捕获组 避免捕获不需要的文本
无脑方法:删除regex前的空格
否则在正则表达式中与空格匹配的non是s so(可能括号太多)
[^d](((+49|0049|0)([s]{0,1})1)[567]d{1,2}([ -/]*d){7})(?!d)
添加可选空白:
[^d]((+49|0049|0)s?(1|9)[1567]d{1,2}([ -/]*d){7,8})(?!d)
更新捕获行起始
如果你想匹配数字,而不必以换行符开始,你可以使用这个。它匹配除了电话号码前的数字以外的任何内容:
(^|[^d])((+49|0049|0)s?(1|9)[1567]d{1,2}([ -/]*d){7,8})(?!d)
test it here