【发布时间】:2014-08-17 20:22:52
【问题描述】:
我设计了正则表达式 (see fiddle) /(\+|0|\()[\d()\s-]{6,20}\d/g 来匹配以下格式的电话号码。
(\+|0|\() 首先匹配 + 或 0 或 (
[\d()\s-] 是匹配中间的数字、括号、空格、连字符
\d是匹配最后一位的数字
+43 543 765 5434
0043 543 765 5434
0543 765 5434
+43 (0)543 765 5434
05437655434
0543-765-5434
不幸的是,这个正则表达式也匹配带有中间换行符的数字,比如
"+43
654 416 4444" 或
"stowasser09
65
808090"
因此我想用
[^\S\r\n]替换正则表达式中的\s以匹配 空格但不是换行符但不能让它工作?另外最好将
{6,20}应用于整个正则表达式,而不是 只是[\d()\s-]-part好吗?我想像/((\+|0|\()[\d()\s-]\d){6,20}/g这样的东西,即整个匹配的电话号码不应短于 6 个字符且不超过 20 个字符,包括 + | 0 | (在第一位和最后一位数字。
谢谢!
【问题讨论】:
-
只需将
\s替换为空格字符(' ') -
最后的建议将避免换行问题,但您的其他问题尚不清楚。请明确定义您想要匹配的模式,以及您不想匹配的模式。 ETC 不是一个有用的描述符。但要匹配数字、数字、可选前导 +、括号、破折号和空格的组合,限制为 6-20 个字符,您可以使用:\+?((?=[-0-9() ])。 ){6,20} 但我不确定这是否是您真正想要的。
-
您真的需要验证它们吗?有小于 6 和大于 20 的,让用户输入他们想要的内容会不会很痛苦。
-
您可以将
\s替换为仅匹配水平空格的\h。 -
@bromelio 现在您的要求更明确了,只需将第一个和最后一个字符定义为任意字符,并适当调整“中间”部分的长度