跳到主要内容

10.1 为什么要嵌入条件

1234-45678900 和 (1234)45678900 都是可接受的固话表示格式,而 123445678900、(1234)-45678900、1234 45678900 我们虽然也能理解,但一般不这样表示。如果让你编写一个正则表达式并让它只匹配 1234-45678900 和 (1234)45678900 这种格式,你会怎么做?

这个问题看似简单,其实颇有难度。下面是最容易想到的解决方案:

\(?\d{4}\)?-?\d{8}
在工具中查看
1234-45678900
(1234)45678900
123445678900
(1234)-45678900
(1234-45678900
1234 45678900

\(? 匹配一个可选的左括号——请注意,这里必须对 ( 进行转义;\d{4} 匹配区号;\)? 匹配一个可选的右括号;-? 匹配一个可选的连字符;\d{8} 匹配剩余的八位数字。原始文本中的最后一行不与这个模式匹配,但第 3、4、5 行与之匹配——这是不正确的,第 3 行没有括号或连字符,第 4 行同时存在连字符和括号,第 5 行多了一个左括号。

\)?-? 替换为 [\)-]? 可以排除第 4 行(字符 ")" 或 "-" 只能出现一个,不允许两个同时出现),但第 3、5 行还是无法排除。正确的模式应该只在电话代码里有一个左括号 "(" 的时候才去匹配 ")"。更准确地说,应该是如果电话号码里有一个左括号 "(",我们的模式必须去匹配 ")";如果不是这样,它就必须去匹配 "-"。这种模式如果不使用条件处理根本无法编写。

该内容基于 《正则表达式必知必会》 二度创作
转载请遵守原作者相关协议并注明本页地址
https://iamhefang.cn/tutorials/正则表达式/第十章-嵌入条件/10.1-为什么要嵌入条件