两种形式的if then else
形如
(?(?=regex)then|else) ,如果前向断言匹配成功则必须匹配then部分,否则匹配else部分。四种断言形式都可以使用。
(?(?=regex)then|else) 正向先行断言的形式。
//echo "abcdefg" |perl -pe 's#(?(?=h)b|e)#_#g'
该表达式比较白话的说,就是如果一个字符后面是regex,那么匹配后面是then的,否则匹配后面是else的,这就导致这种形式意义不大,该位置后面为regex的时候,then如果=regex才匹配,否则匹配else。
(?(?!regex) then|else) 负向先行断言的形式
这个该表达式和上面类似,意义不大。
(?(?<=regex)then|else) 正向后行断言的形式
该表达式,如果前面是regex的话,匹配后面的then,否则匹配else
(?(?<=re)g|t) //string regrettable
匹配re后面的g,但是不匹配re后面的t,但是匹配不是re后面的t
(?(?<!regex) then|else)负向后行断言的形式
形如(?(1)then|else)的if then else
如果获得第一个分组成功,则(1)then,否则(1)else
//echo "repeat rescure" |perl -pe 's#(re){0,2}(?(1)p|c)#_#'
前后断言
向前看去
是 5: (?=5)
不是5: (?!5)
向后看去
是 5: (?<=5)
不是5: (?<!5)
形如
(?(?=regex)then|else) ,如果前向断言匹配成功则必须匹配then部分,否则匹配else部分。四种断言形式都可以使用。
(?(?=regex)then|else) 正向先行断言的形式。
//echo "abcdefg" |perl -pe 's#(?(?=h)b|e)#_#g'
该表达式比较白话的说,就是如果一个字符后面是regex,那么匹配后面是then的,否则匹配后面是else的,这就导致这种形式意义不大,该位置后面为regex的时候,then如果=regex才匹配,否则匹配else。
(?(?!regex) then|else) 负向先行断言的形式
这个该表达式和上面类似,意义不大。
(?(?<=regex)then|else) 正向后行断言的形式
该表达式,如果前面是regex的话,匹配后面的then,否则匹配else
(?(?<=re)g|t) //string regrettable
匹配re后面的g,但是不匹配re后面的t,但是匹配不是re后面的t
(?(?<!regex) then|else)负向后行断言的形式
形如(?(1)then|else)的if then else
如果获得第一个分组成功,则(1)then,否则(1)else
//echo "repeat rescure" |perl -pe 's#(re){0,2}(?(1)p|c)#_#'
前后断言
向前看去
是 5: (?=5)
不是5: (?!5)
向后看去
是 5: (?<=5)
不是5: (?<!5)