排除正则表达式匹配的最后一个字符

时间:2015-11-12 21:07:30

标签: regex

我有以下正则表达式:

%(?:\\.|[^%\\ ])*%([,;\\\s]) 

效果很好但很明显它也会突出显示上一个%的下一个字符。

我想知道如何从正则表达式中排除它?

例如,如果我有:

The files under users\%username%\desktop\ are:

它会突出显示%username%\,但我只想要%username%。另一方面,如果我像这样离开正则表达式:

%(?:\\.|[^%\\ ])*%

...然后它将匹配我不想要的这种模式:

%example1%example2%example3

知道如何通过正则表达式排除匹配中的最后一个字符吗?

2 个答案:

答案 0 :(得分:3)

%(?:\\.|[^%\\ ])*%(?=[,;\\\s])

                   ^^

使用lookahead。您需要的是0 width assertion,它不会捕获任何内容。

答案 1 :(得分:1)

您可以使用比目前使用的更有效的正则表达式。当交替与量词一起使用时,会涉及不必要的回溯。

如果你的琴弦很短,可以使用。但是,如果它们可能会更长一些,您可能需要“展开”表达式。

以下是如何完成的:

%[^"\\%]*(?:\\.[^"\\%]*)*%

正则表达式细分:

  • % - 初始百分号
  • [^"\\%]* - 展开的模式的开头:除双引号,反斜杠和百分号以外的0个或更多字符
  • (?:\\.[^"\\%]*)* - 0个或更多个序列...
    • \\. - 一个字面反斜杠,后跟换行符以外的任何字符
    • [^"\\%]* - 除双引号,反斜杠和百分号以外的0个或多个字符
  • % - 尾随百分号

使用this demo,查看%(?:\\.|[^" %\d\\])*% - 6个步骤与30个步骤。