【问题标题】:Match numbers with space but not linebreak in between?匹配带有空格的数字但不匹配中间的换行符?
【发布时间】: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"

  1. 因此我想用[^\S\r\n] 替换正则表达式中的\s 以匹配 空格但不是换行符但不能让它工作?

  2. 另外最好将{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 现在您的要求更明确了,只需将第一个和最后一个字符定义为任意字符,并适当调整“中间”部分的长度

标签: php regex newline space


【解决方案1】:

\s 表示:匹配任何空白字符。只需将其替换为简单的空格' '

/(\+|0|\()[\d() -]{6,20}\d/g

看到这个demo

【讨论】:

  • 谢谢你,这回答了我的第一个问题!
  • @bromelio car 你解释一下你的第二个问题吗?
  • @bromelio 第一个 +|0|( 是必需的。所以只需从{6,20} 中减去1。它将变为{5, 19}
猜你喜欢
  • 2019-01-12
  • 2021-07-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 2017-05-21
  • 2011-12-18
  • 1970-01-01
  • 2019-06-12
相关资源
最近更新 更多