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-为什么要嵌入条件