优化德国手机号码的正则表达式
Optimize a regex for German mobile numbers
我有一个正则表达式,可以从网站中提取德国手机 phone 号码:
[^\d]((\+49|0049|0)1[567]\d{1,2}([ \-/]*\d){7})(?!\d)
正如您在 demo 中看到的那样,它运行良好。唯一不匹配的模式是:
+49 915175461907
请查看链接演示中的更多示例。问题是 +49
.
后面的空格
我需要如何更改当前的正则表达式模式才能匹配这些类型的模式?
添加一个可选的白色space:
[^\d]((\+49|0049|0)\s?(1|9)[1567]\d{1,2}([ \-/]*\d){7,8})(?!\d)
更新-捕获行首
如果您想要匹配数字而不必以换行符开头,您可以使用它。它匹配除 phone 之前数字以外的任何内容 number:
(^|[^\d])((\+49|0049|0)\s?(1|9)[1567]\d{1,2}([ \-/]*\d){7,8})(?!\d)
无脑方法:删除正则表达式前的space。
否则在正则表达式中匹配非 space 是 \s 所以(可能括号太多)
[^\d](((\+49|0049|0)([\s]{0,1})1)[567]\d{1,2}([ \-/]*\d){7})(?!\d)
更好的正则表达式是:
(?<!\d)(?:\+49|0049|0) *[19][1567]\d{1,2}(?:[ /-]*\d){7,8}(?!\d)
变化:
(?<!\d)
: 确保前一个字符不是数字
[19][1567]
:匹配 1
或 9
后跟 [1567]
数字之一
{7,8}
:匹配给定结构的 7 或 8 次重复
- 最好在字符的第一个或最后一个位置保留一个未转义的连字符 class
- 使用非捕获组避免捕获不需要的文本
我有一个正则表达式,可以从网站中提取德国手机 phone 号码:
[^\d]((\+49|0049|0)1[567]\d{1,2}([ \-/]*\d){7})(?!\d)
正如您在 demo 中看到的那样,它运行良好。唯一不匹配的模式是:
+49 915175461907
请查看链接演示中的更多示例。问题是 +49
.
我需要如何更改当前的正则表达式模式才能匹配这些类型的模式?
添加一个可选的白色space:
[^\d]((\+49|0049|0)\s?(1|9)[1567]\d{1,2}([ \-/]*\d){7,8})(?!\d)
更新-捕获行首
如果您想要匹配数字而不必以换行符开头,您可以使用它。它匹配除 phone 之前数字以外的任何内容 number:
(^|[^\d])((\+49|0049|0)\s?(1|9)[1567]\d{1,2}([ \-/]*\d){7,8})(?!\d)
无脑方法:删除正则表达式前的space。
否则在正则表达式中匹配非 space 是 \s 所以(可能括号太多)
[^\d](((\+49|0049|0)([\s]{0,1})1)[567]\d{1,2}([ \-/]*\d){7})(?!\d)
更好的正则表达式是:
(?<!\d)(?:\+49|0049|0) *[19][1567]\d{1,2}(?:[ /-]*\d){7,8}(?!\d)
变化:
(?<!\d)
: 确保前一个字符不是数字[19][1567]
:匹配1
或9
后跟[1567]
数字之一{7,8}
:匹配给定结构的 7 或 8 次重复- 最好在字符的第一个或最后一个位置保留一个未转义的连字符 class
- 使用非捕获组避免捕获不需要的文本