好的,所以我知道在 lookahead 和 lookbehind 上有一些正则表达式的问题,但我没有找到一些问题,我的内部问题,我可以很容易地与相关联(......哦)。
所以这就是我如何理解正则表达式的前瞻和后瞻!
主要正则表达式之前的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)
好的,对于第二部分(成功),我真的不确定,我会感谢上面的符号的重写,或者对我的出色理解赞不绝口(哦,是的)。
所以回到地球上,据我所知,在“主要”正则表达式中匹配的每个角色之后...
让我们来看看这个正则表达式
(?<=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
基本上,我理解的是:
我不知道,如果我写的是准确哈哈。当我想尝试它时,它会变得混乱。大多数时候我通过试验和错误获得了成功,但我希望得到一些澄清,以便我可以在第一次尝试时得到它。吊杆
感谢您的回复!
答案 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