正则表达式-嵌入条件
不是所有环境下的正则表达式都支持条件处理。
正则表达式里的条件要用?定义。
?这个元字符表示的意思很多,一定要区分开。有这么几种意思:
a.作为量词,跟在一个字符或子表达式后面表示可出现0或1次。
b.表非贪婪模式,跟在量词元字符后面,如??、*?、+?
c.在前后向查找里使用,如(?=)、(?<=)、(?!)
d.表逻辑判断、条件。
1.回溯引用条件
example_1
回溯引用条件是在前面的子表达式匹配成功的情况下才允许使用的,定义这种条件的语法是(?(backreference)true-regex)。看一个例子:
如果前面匹配到[A]则后面也必须匹配到[A]
example_2
刚刚是满足条件下执行一个表达式。条件还可以有否则表达式。用来定义这种条件的语法是(?(backreference)true-regex|false-regex)
以北美电话号码格式匹配做为例子。(123)456-7890和123-456-7890都是可接受的格式。很明显,如果有(则必须匹配到),否则要匹配到-。
正则表达式 (()?d{3}(?(1))|-)d{3}-d{4}
文本 123-456-7890 (123)456-7890
匹配结果 123-456-7890 (123)456-7890
分析: (()?匹配一个可选的( 。然后(?(1))|-)判断如果(1)存在,则必须要匹配到),否则-必须被匹配到。
2.前后查找条件
example_1
匹配美国的邮政编码,一种是12345形式的格式,另一种是12345-6789的格式。
这里第三行也匹配上了,显然不是想要的格式。所以,如果出现了-那么其后一定要有4个数字。
写正则表达式需要严密的逻辑,要把必须匹配的情况考虑周全并写出一个符合预期的正则表达式很容易,但把不需要匹配的情况也考虑周全并将它们排除往往困难的多。
(?(?=-)-d{4})如果…这个表达式不对。 再想想
以上参考书籍《正则表达式必知必会》