正则表达式中的预搜索

格式:

  1.正向预搜索,右侧是或者不是什么:"(?=xxxxx)","(?!xxxxx)";

  2.反向预搜索,左侧是或者不是什么:"(?<=xxxxx)","(?<!xxxxx)"

注意:

  1.括号是必须的且不参与反向引用中个数的计算;例如 正则表达式 (?=12)(\d{2})\1 在匹配字符‘12123’的时候,匹配成功,返回字符"1212"

  2.预搜索内只是限制条件,本身不匹配任意字符;例如 正则表达式 (?=1234)\d{1} 在匹配字符'123456'的时候,匹配成功,返回字符‘1’,而不是‘12345’

例子:

  待验证字符:a1aa fbffff 989999999

  正则表达式:(\w)((?=\d\1\1)(\d))+

  匹配流程:

    \w => 先找出字符a,即\1

    (?=\d\1\1) => 再判断第一个a之后的字符是否为\daa格式,很显然是的,即‘1aa’;

    (\d),预搜索是不匹配字符的,所以\d匹配到的是1

    所以得到第一个结果 a1

 

    \w => 先找出字符f,即\1

    (?=\d\1\1) => 再判断第一个f之后的字符是否为\daa格式,很显然‘faa’不满足;如果把第三个f改为任意数字,则会匹配到(f1ff)

    

    \w => 先找出字符9,即\1

    (?=\d\1\1) => 再判断第一个9之后的字符是否为\daa格式,很显然是的,即‘899’;

    (\d),预搜索是不匹配字符的,所以\d匹配到的是8

    所以得到第一个结果 98

    因为 ((?=\d\1\1)(\d))+ 格式;可以继续向后找;

      从第三个数字9向后查找,得到第三至第五个数字 9(\w)9(\1)9(\1)复合要求,获取到第三个数字9

      从第四个数字9向后查找,得到第四至第六个数字 9(\w)9(\1)9(\1)复合要求,获取到第四个数字9

      ...

      从第七个数字9向后查找,得到第七至第九个数字 9(\w)9(\1)9(\1)复合要求,获取到第七个数字9

      从第八个数字9向后查找,此时只剩下2个九不满足匹配条件

    最终结果为:9899999;最后的两个九是无法匹配到的

最最终结果为:[["a1","9899999"],["a","9"],["1","9"],["1","9"]]

posted @ 2022-11-17 11:49  Ryuma  阅读(350)  评论(0)    收藏  举报