正则表达式前瞻和后视说明

Regex Lookahead and Lookbehind clarifications

好的,所以我知道这里有一些关于 lookaheadlookbehind 的正则表达式问题,但我还没有找到一些答案,对于我内心的问题,我很容易联想到(...哦好吧)。

这就是我对正则表达式前瞻和后视的理解!

Lookaheads/Lookbehinds (LA/LB) :

LA/LB preceding main Regex

(?=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 succeeding main 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. 负向回溯:它检查匹配的内容是否仍然与回溯部分不匹配。

现在,对于 SRLC 部分(Super Regex Lookout Combos)

Let's look at this Regex

(?<=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 失败,全局匹配将被重置。

我不知道,如果我写的是准确的哈哈。当我想尝试它时,它太乱了。大多数时候我通过反复试验获得成功,但我想澄清一下,以便我可以在第一次尝试时得到它。繁荣

感谢您的回复!

成功理解断言是因为它们所有涉及
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