如果我写
(?<=\()\w+(?=\))
对于此字符串: (Test) (Test2) (Test3)
我会得到:Test Test2 Test3
那讲得通。
如果我写
\w+ (?<=\()\w+(?=\))
对于此字符串:LTE(测试)
它什么都不返回..这里有什么问题?
请清楚地解释您的正则表达式,因为它可能难以阅读。
请您参考如下方法:
环视不消耗字符!
这是一个逐步查看它的方法(可能不是最好的,但无论如何我都是这样解释的):
第一个字符是 L
,正则表达式引擎将其与 \w+
进行比较并同意这是一场比赛。 T
也是如此,然后 E
.
在空格处,正则表达式引擎在正则表达式中看到一个空格,这也很好。
接下来是开头括号,但是正则表达式看到了什么?请记住,环视不消耗字符,因此 \(
在 (?<=\()
实际上并没有被消耗和 \(
不匹配什么\w+
火柴!
您可能会考虑使用这些字符的正则表达式:\w+ \w+
,但在第二个 \w+
上有条件,它必须在括号之间找到。条件可能满足,但表达式本身不匹配任何括号!
要使其匹配,您应该添加括号:
\w+ \((?<=\()\w+(?=\))\)
看到匹配空格后,正则引擎看到
(
,与提供的表达式一致,它向前移动。
然后引擎看到
T
.首先,它是否匹配下一个字符,
\w+
?是的,第二,在它之前有一个开放的括号吗?是的。
在前进之前,它看到了积极的展望。前面有闭包吗?不,还有
e
,但是
\w+
还是可以满足的,所以匹配
e
与另一个
\w
.这种情况一直持续到
t
.
t
之后是否有结束括号?是的,因此进行下一个检查。
它遇到了一个结束括号,它与表达式中的结束括号匹配(注意,文字结束括号可以在这里删除,而您将匹配
LTE (Test
)。
但是有了这一切,放弃环视可能同样好:
\w+ \(\w+\)
因为它们给引擎增加了更多的压力,即使它在小规模上不那么明显,但在更大的字符串上可能很重要。
希望它有所帮助,即使是一点点!