我有以下正则表达式:
%(?:\\.|[^%\\ ])*%([,;\\\s])
Run Code Online (Sandbox Code Playgroud)
这很好但很明显它也突出了下一个角色%
.
我想知道如何从正则表达式中排除它?
例如,如果我有:
The files under users\%username%\desktop\ are:
Run Code Online (Sandbox Code Playgroud)
它会突出%username%\
但我只是想要%username%
.另一方面,如果我像这样离开正则表达式:
%(?:\\.|[^%\\ ])*%
Run Code Online (Sandbox Code Playgroud)
...那么它将匹配我不想要的这种模式:
%example1%example2%example3
Run Code Online (Sandbox Code Playgroud)
知道如何通过正则表达式排除比赛中的最后一个字符吗?
%(?:\\.|[^%\\ ])*%(?=[,;\\\s])
^^
Run Code Online (Sandbox Code Playgroud)
使用lookahead
.What 你在这里需要的是0 width assertion
它不捕获任何东西。
您可以使用比当前使用的更有效的正则表达式。当交替与量词一起使用时,会涉及不必要的回溯。
如果您拥有的字符串很短,则可以使用。但是,如果它们可以更长一点,您可能需要“展开”表达式。
这是如何完成的:
%[^"\\%]*(?:\\.[^"\\%]*)*%
Run Code Online (Sandbox Code Playgroud)
正则表达式细分:
%
- 初始百分号[^"\\%]*
- 展开模式的开头:除双引号、反斜杠和百分号之外的 0 个或多个字符(?:\\.[^"\\%]*)*
- 0 个或多个序列...
\\.
- 文字反斜杠后跟除换行符之外的任何字符[^"\\%]*
- 0 个或多个除双引号、反斜杠和百分号之外的字符%
- 尾随百分号请参阅此演示- 6 个步骤与 30 个步骤(使用您的%(?:\\.|[^" %\d\\])*%
.