ham*_*obi 5 regex regex-lookarounds
如果我写
(?<=\()\w+(?=\))
Run Code Online (Sandbox Code Playgroud)
对于这个字符串:(测试)(测试2)(测试3)
我会得到:Test Test2 Test3
那讲得通.
如果我写
\w+ (?<=\()\w+(?=\))
Run Code Online (Sandbox Code Playgroud)
对于这个字符串:LTE(测试)
什么都没有回报..问题是什么?
请清楚解释你的正则表达式,因为它很难阅读.
Lookarounds不消耗字符!
这是一步一步看到它(可能不是最好的,但这就是我解释它的方式):
第一个字符是L,正则表达式引擎将其与之进行比较\w+并同意它是匹配的.同样的情况发生了T,那么E.
在空间中,正则表达式引擎在正则表达式中看到一个空格,这也很好.
接下来是开场白,但正则表达式看到了什么?请记住,lookarounds不会消耗字符,因此\(in (?<=\()实际上并\(没有被消耗,并且与匹配的内容不\w+匹配!
你可能会想到正则表达式实际上消耗了这些字符:\w+ \w+但是在第二个条件下\w+,必须在parens之间找到它.条件可能会满足,但表达式本身与任何括号都不匹配!
要使其匹配,您应该添加parens:
\w+ \((?<=\()\w+(?=\))\)
Run Code Online (Sandbox Code Playgroud)
在查看并匹配空间之后,正则表达式引擎看到(,它与提供的表达式一致,它向前移动.
然后发动机看到了T.首先,它与下一个角色匹配\w+吗?是的,第二,之前是否有一个开放式的paren?是.
在向前迈进之前,它看到了一个积极的前瞻性.前面还有一个关闭的人吗?不,有e,但\w+仍然可以满足,所以它e与另一个匹配\w.这种情况继续这样下去t.之后是关闭的t吗?是的,从而进行下一次检查.
它会遇到一个关闭的paren,它与表达式中的关闭paren相匹配(请注意,文字关闭的paren可以在这里删除,而你将匹配LTE (Test).
但有了这一切,放弃外观可能同样出色:
\w+ \(\w+\)
Run Code Online (Sandbox Code Playgroud)
因为它们会在发动机上增加更多的应变,即使它在小规模上不可见,但在较大的弦上它可能很重要.
希望它有所帮助,即使它有点!
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |