正则表达式前瞻和后视说明
Regex Lookahead and Lookbehind clarifications
好的,所以我知道这里有一些关于 lookahead 和 lookbehind 的正则表达式问题,但我还没有找到一些答案,对于我内心的问题,我很容易联想到(...哦好吧)。
这就是我对正则表达式前瞻和后视的理解!
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)
好的,对于第二部分(成功),我真的不确定,我希望能对上面的符号进行一些重写,或者对我的理解竖起大拇指(哦耶)。
所以回到地球上,据我所知,在“主要”正则表达式中匹配的每个字符之后...
- 正向前瞻:它检查前方的内容是否仍然与前瞻部分匹配。
- 负前瞻:它检查前方的内容是否仍然与前瞻部分不匹配。
- 正后视:它检查匹配的内容是否仍然与后视部分匹配
- 负向回溯:它检查匹配的内容是否仍然与回溯部分不匹配。
现在,对于 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
基本上,我的理解是:
- REGEX_C必须先成功才能为MAIN_REGEX开始匹配
- 然后,MAIN_REGEX开始匹配一个字符一个字符
- 正匹配后,REGEX_3立即分析全局匹配。
- 接下来是REGEX_4,谁会往前看,看看是否一切都好。
- 然后我们从2开始并尝试匹配下一个字符。
- *当然,如果任何 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
好的,所以我知道这里有一些关于 lookahead 和 lookbehind 的正则表达式问题,但我还没有找到一些答案,对于我内心的问题,我很容易联想到(...哦好吧)。
这就是我对正则表达式前瞻和后视的理解!
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)
好的,对于第二部分(成功),我真的不确定,我希望能对上面的符号进行一些重写,或者对我的理解竖起大拇指(哦耶)。
所以回到地球上,据我所知,在“主要”正则表达式中匹配的每个字符之后...
- 正向前瞻:它检查前方的内容是否仍然与前瞻部分匹配。
- 负前瞻:它检查前方的内容是否仍然与前瞻部分不匹配。
- 正后视:它检查匹配的内容是否仍然与后视部分匹配
- 负向回溯:它检查匹配的内容是否仍然与回溯部分不匹配。
现在,对于 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
基本上,我的理解是:
- REGEX_C必须先成功才能为MAIN_REGEX开始匹配
- 然后,MAIN_REGEX开始匹配一个字符一个字符
- 正匹配后,REGEX_3立即分析全局匹配。
- 接下来是REGEX_4,谁会往前看,看看是否一切都好。
- 然后我们从2开始并尝试匹配下一个字符。
- *当然,如果任何 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