正则表达式

正则表达式 知识量:10 - 22 - 55

10.2 嵌入条件的两种用法><

回溯引用条件- 10.2.1 -

回溯引用条件用于:当且仅当前面的子表达式搜索取得成功的条件下才允许执行后面的表达式。

回溯引用条件有两种语法格式:

  1. (?(回溯引用的子表达式)满足条件时执行的表达式)。

  2. (?(回溯引用的子表达式)满足条件时执行的表达式|不满足条件时执行的表达式)。

回溯引用条件的语法与Java、php等语言的三元运算符很像,也可以理解为if...else...语句。

示例文本:匹配正确的电话号码。

010-25689856
(0531)56236541
0755 62235641
(021-55254126

正则表达式:

(?m)^([\d,(\()])?\d{2,4}(?(1)\)|-)\d{8}\b

结果:

MatchPositionLength
010-25689856012
(0531)562365411414

分析一下以上正则表达式的含义:

  • (?m) 表示分行匹配模式,从每一行的开始进行匹配,而不是只从全部文本的开始进行匹配。

  • ^([\d,(\()])? 表示以数字或左括号“(”开始,且它可以有也可以没有。注意左括号被设定为第一个子表达式:“(\()”。

  • \d{2,4} 表示2-4个数字。

  • (?(1)\))|-) 表示回溯引用条件:如果第一个子表达式存在,即“(\()”存在,则匹配右括号“)”,否则匹配“-”。

  • \d{8} 表示8个数字。

  • \b 表示单词边界,确保正好以8个数字结束。

前后查找条件- 10.2.2 -

前后查找条件用于:当且仅当一个向前查找或向后查找取得成功的条件下才允许执行后面的表达式。

前后查找条件的语法结构与回溯引用条件的语法相似,将回溯引用的子表达式替换为前后查找表达式即可。

示例文本:找出所有英文缩写,当有冒号(:)时,同时给出解释。

BBC:British Broadcasting Corporation
FBI
NBA is Negro Basketball Association
WTO:World Trade Organization
UN is United Nations

正则表达式:

(?m)^[a-zA-Z]+(?(?=:).*$)

结果:

MatchPositionLength
BBC:British Broadcasting Corporation037
FBI383
NBA433
WTO:World Trade Organization8029
UN1102

以上正则表达式的含义是:

  • (?m) 表示分行匹配模式,从每一行的开始进行匹配,而不是只从全部文本的开始进行匹配。

  • ^\w+ 表示以字母开始。

  • (?(?=:)) 表示向前查找条件:当向前查找成功时,即冒号(:)存在时,执行其后面的匹配。

  • .*$ 表示匹配其后面的字符,直至遇到换行。