正则表达式之正向预查和反向预查
1.正向预查
现在,我们假设需要仅匹配 Windows,不匹配后⾯的版本号,并且要求 Windows 后⾯的版本号只能是数字类型,换⾔之,XP 和 Vista 不能被匹配,
在正则表达式中,可以使⽤正向预查来解决这个问题。本例中,写法是:“Windows(?= [\d.]+\b)”。
它的语法是在⼦模式内部前⾯加“?=”,表⽰的意思是:⾸先,要匹配的⽂本必须满⾜此⼦模式前⾯的表达式(本例,“Windows ”);其次,此⼦模式不参与匹配。
Text:
Windows 1.03 and Windows 2.0 fisrt Released in 1985 and 1987 respectively.
Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.
RegEx:
Windows( ?=[\d.]+\b)
Result:(带下划线的为成功匹配的)
Windows 1.03 and Windows 2.0 fisrt Released in 1985 and 1987 respectively.
Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.
可以将正向预查理解成为⾃定义的边界(\b),这个边界位于表达式末。
反⾔之,你可以将位于表达式末的 \b 理解成⾮获取匹配的⼀个特例:(?=[ ,.\r\n<>;\-])。注意,这⾥没有写全边界符号。
Text:
aaaax-aaa
aaaaxaaaa
RegEx:
x(?=[,.\r\n<>;\-])
Result:
aaaax-aaa
aaaaxaaaa
你也可以这样理解上⾯的匹配过程:
1. 先进⾏普通匹配:Windows ([\d.]+\b)
2. 然后从匹配⽂本中将⼦模式内的⽂本排除掉。
2.反向预查
在上⾯的例⼦中,我们知道正向预查类似于⾃定义的位于⽂本末的字符边界。那么⾃然应该有位于⽂本⾸的情况,⽐如说,我们要匹配下⾯⽂本中属于 CNY 的⾦额:
Text:
CNY: 128.04
USD: 22.5
USD: 23.5
HKD: 1533.5
CNY: 23.78
RegEx:
CNY: \d+\.\d+
Result:
CNY: 128.04
USD: 22.5
USD: 23.5
HKD: 1533.5
CNY: 23.78
与上⾯类似,我们现在要求仅匹配⾦额,⽽不匹配前⾯的 “CNY:”
正则表达式中,可以使⽤反向预查来解决这个问题。本例中,写法是:(?<=CNY: )\d+\.\d+
反向预查的语法是在⼦模式内部前⾯加“?<=”,表⽰的意思是:⾸先,要匹配的⽂本必须满⾜此⼦模式后⾯的表达式(本例,“\d+.\d+”);其次,此⼦模式不参与匹配。
Text:
CNY: 128.04
USD: 22.5
USD: 23.5
HKD: 1533.5
CNY: 23.78
Page 39 of 42
RegEx:
(?<=CNY: )\d+\.\d+
Result:
CNY: 128.04
USD: 22.5
正则化正交匹配追踪USD: 23.5
HKD: 1533.5
CNY: 23.78
与前⾯类似:你可以将反向预查理解成为⾃定义的边界(\b),这个边界位于表达式⾸。
反⾔之,你可以将位于表达式⾸的 \b 理解成⼀个⾮获取匹配的⼀个特例:(?<=[ ,.\r\n<>;\-])。注意,我没有写全所有边界。
Text:
aaa-xaaaa
aaaxaaaaa
RegEx:
(?<=[,.\r\n<>;\-])x
Result:
aaa-xaaaa
aaaxaaaaa
你也可以这样理解上⾯的匹配过程:
1. 先进⾏普通匹配:(CNY: )\d+\.\d+
2. 然后从匹配⽂本中将⼦模式内的⽂本排除掉。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。