正则表达式Lookahead和Lookbehind澄清

时间:2016-02-22 17:53:52

标签: regex lookahead lookbehind

好的,所以我知道在 lookahead lookbehind 上有一些正则表达式的问题,但我没有找到一些问题,我的内部问题,我可以很容易地与相关联(......哦)。

所以这就是我如何理解正则表达式的前瞻和后瞻!

Lookaheads / Lookbehinds(LA / LB):

  

主要正则表达式之前的LA / LB

(?=IF_YOU_FIND_WHAT_IS_HERE)START_MATCHING_WHAT_IS_HERE
(?!IF_YOU_DO_NOT_FIND_WHAT_IS_HERE)START_MATCHING_WHAT_IS_HERE
     

LA / LB接替主Regex

START_MATCHING_WHAT_IS_HERE(?=UNTIL_THIS IS_NOT TRUE)
START_MATCHING_WHAT_IS_HERE(?!UNTIL_THIS IS_NOT TRUE)

好的,对于第二部分(成功),我真的不确定,我会感谢上面的符号的重写,或者对我的出色理解赞不绝口(哦,是的)。

所以回到地球上,据我所知,在“主要”正则表达式中匹配的每个角色之后...

  1. 积极前瞻:它会检查前方的内容是否与前瞻部分相符。
  2. 否定前瞻:它会检查前方的内容是否与前瞻部分不匹配。
  3. 正面看后方:它会检查匹配的内容是否仍然与后方部分匹配
  4. 负面观察:它会检查匹配的内容是否仍然与后方部分不匹配。
  5. 现在,对于SRLC部分(Super Regex Lookout Combos)

      

    让我们来看看这个正则表达式

    (?<=REGEX_1)(?<!REGEX_2((MAIN_REGEX(?<!REGEX_3))(?=REGEX_4)))
    

    我的策略是,在某些情况下,我们可以将REGEX_1和REGEX_2结合起来。如果是这种情况,我们会:

    (?<=REGEX_C)((MAIN_REGEX(?<!REGEX_3))(?=REGEX_4))
    
         

    C for:Combined

    基本上,我理解的是:

    1. REGEX_C必须首先成功才能使MAIN_REGEX开始匹配
    2. 然后,MAIN_REGEX开始匹配逐个字符
    3. 肯定匹配之后,REGEX_3立即分析全球匹配。
    4. 接下来是REGEX_4,他将展望未来,看看是否一切都很好。
    5. 然后我们从2 开始尝试匹配下一个字符
    6. *当然,如果任何REGEX失败,则重置全局匹配
    7. 我不知道,如果我写的是准确哈哈。当我想尝试它时,它会变得混乱。大多数时候我通过试验和错误获得了成功,但我希望得到一些澄清,以便我可以在第一次尝试时得到它。吊杆

      感谢您的回复!

1 个答案:

答案 0 :(得分:1)

成功理解断言是他们所有都涉及到 从 BETWEEN 字符的方向看,而不是在,之前,之后,之后 或者你能想到的任何其他事情。

由于它们介于字符之间,因此优先进行分析 正则表达式引擎。

字符匹配的优先级是从 正则表达式的阅读顺序也是如此。

断言的优先级是:
首先检查事物之前的断言。
最后检查一些事后的断言。

并且,字符之间的位置是检查的位置 在编写断言时,你必须想象自己处于那个位置。

更新更多解释

通常,更好地习惯断言的最佳方法是查看示例。

这是我看到的模板表达式。

 (?<= REGEX_1 )      # Here is Between a character, lookbehind for a certain set of chars

 (?<! REGEX_2 )      # At the same place, lookbehind that a char subset is not there;

 (                   # (1 start)
      MAIN_REGEX          # Some data to match
 )                   # (1 end)

 (?<! REGEX_3 )      # Here is Between the last char matched in group 1
                     # and the next character yet to be matched.
                     # Look behind at the last char matched in group 1  
                     # and make sure it is within a set of chars.

 (?= REGEX_4 )       # At the same place, look ahead that a subset of chars are there

这是更具体的事情。

这就是正则表达式如何查找边界构造\b这个词 字边界实际上只存在于字符之间 它以两种不同的方式查看两个方向以满足自己。

研究一下。

 (?:                           # Cluster start
      (?:                           # -------
           ^                             # Beginning of string anchor
        |                              # or,
           (?<= [^a-zA-Z0-9_] )          # Lookbehind assertion for a char that is NOT a word
      )                             # -------
      (?= [a-zA-Z0-9_] )            # Lookahead assertion for a char that is IS a word

   |                              # or,

      (?<= [a-zA-Z0-9_] )           # Lookbehind assertion for a char that is IS a word
      (?:                           # -------
           $                             # End of string anchor
        |                              # or,
           (?= [^a-zA-Z0-9_] )           # Lookahead assertion for a char that is NOT a word
      )                             # -------
 )                             # Cluster end