优化德国手机号码的正则表达式
Posted
技术标签:
【中文标题】优化德国手机号码的正则表达式【英文标题】:Optimize a regex for German mobile numbers 【发布时间】:2021-12-05 13:57:38 【问题描述】:我有一个从网站中提取德国手机号码的正则表达式:
[^\d]((\+49|0049|0)1[567]\d1,2([ \-/]*\d)7)(?!\d)
正如您在demo 中看到的那样,它运行良好。唯一不匹配的模式是:
+49 915175461907
请在链接的演示中查看更多示例。问题是+49
后面的空格。
我需要如何更改当前的正则表达式模式才能匹配这些类型的模式?
【问题讨论】:
单个可选空格可以用空格加问号来匹配。 不要在开头使用[^\d]
,而是使用负面的后视:(?<!\d)
。这样它也将直接匹配字符串的开头。对于这种情况,您当前的正则表达式失败。
不正确的欺骗,因为问题不仅仅是允许空格。如果输入以 +4915207829969
开头,否定字符类 [^\d]
将导致它不匹配
【参考方案1】:
添加一个可选的空格:
[^\d]((\+49|0049|0)\s?(1|9)[1567]\d1,2([ \-/]*\d)7,8)(?!\d)
更新-捕获行首
如果你想匹配数字而不一定以换行符开头,你可以使用它。它匹配除电话号码前的数字以外的任何内容:
(^|[^\d])((\+49|0049|0)\s?(1|9)[1567]\d1,2([ \-/]*\d)7,8)(?!\d)
test it here
【讨论】:
【参考方案2】:更好的正则表达式是:
(?<!\d)(?:\+49|0049|0) *[19][1567]\d1,2(?:[ /-]*\d)7,8(?!\d)
Updated RegEx Demo
变化:
(?<!\d)
:确保前一个字符不是数字
[19][1567]
:匹配 1
或 9
后跟 [1567]
数字之一
7,8
:匹配给定结构的 7 或 8 次重复
最好在字符类的第一个或最后一个位置保留未转义的连字符
使用非捕获组避免捕获不需要的文本
【讨论】:
【参考方案3】:无脑方法:在正则表达式之前删除空格。
否则在正则表达式中匹配非空格是 \s 所以(可能是括号太多)
[^\d](((\+49|0049|0)([\s]0,1)1)[567]\d1,2([ \-/]*\d)7)(?!\d)
【讨论】:
非常感谢。效果很好,除了开头有9
这样的数字:+49 915175461907
以上是关于优化德国手机号码的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章