我有以下正则表达式:
%(?:\\.|[^%\\ ])*%([,;\\\s])
效果很好但很明显它也会突出显示上一个%
的下一个字符。
我想知道如何从正则表达式中排除它?
例如,如果我有:
The files under users\%username%\desktop\ are:
它会突出显示%username%\
,但我只想要%username%
。另一方面,如果我像这样离开正则表达式:
%(?:\\.|[^%\\ ])*%
...然后它将匹配我不想要的这种模式:
%example1%example2%example3
知道如何通过正则表达式排除匹配中的最后一个字符吗?
答案 0 :(得分:3)
%(?:\\.|[^%\\ ])*%(?=[,;\\\s])
^^
使用lookahead
。您需要的是0 width assertion
,它不会捕获任何内容。
答案 1 :(得分:1)
您可以使用比目前使用的更有效的正则表达式。当交替与量词一起使用时,会涉及不必要的回溯。
如果你的琴弦很短,可以使用。但是,如果它们可能会更长一些,您可能需要“展开”表达式。
以下是如何完成的:
%[^"\\%]*(?:\\.[^"\\%]*)*%
正则表达式细分:
%
- 初始百分号[^"\\%]*
- 展开的模式的开头:除双引号,反斜杠和百分号以外的0个或更多字符(?:\\.[^"\\%]*)*
- 0个或更多个序列...
\\.
- 一个字面反斜杠,后跟换行符以外的任何字符[^"\\%]*
- 除双引号,反斜杠和百分号以外的0个或多个字符%
- 尾随百分号使用this demo,查看%(?:\\.|[^" %\d\\])*%
- 6个步骤与30个步骤。