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

use*_*624 6 regex

我有以下正则表达式:

%(?:\\.|[^%\\ ])*%([,;\\\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)

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

vks*_*vks 5

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

                   ^^
Run Code Online (Sandbox Code Playgroud)

使用lookahead.What 你在这里需要的是0 width assertion它不捕获任何东西。


Wik*_*żew 4

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

如果您拥有的字符串很短,则可以使用。但是,如果它们可以更长一点,您可能需要“展开”表达式。

这是如何完成的:

%[^"\\%]*(?:\\.[^"\\%]*)*%
Run Code Online (Sandbox Code Playgroud)

正则表达式细分:

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

请参阅此演示- 6 个步骤与 30 个步骤(使用您的%(?:\\.|[^" %\d\\])*%.