Java 想要所有%n个非';t在反勾号或引号内

Java 想要所有%n个非';t在反勾号或引号内,java,regex,Java,Regex,我想匹配形式为%n的所有子字符串,其中n是一个数字以及空格前的第一个单词: e、 g 将返回foo%1%2%3 但是,字符串也可能有引号或反勾号,在下面的示例中,我不希望返回%4 "foo %1 %2 `bar %4` %3" <= only return foo %1 %2 %3 "foo %1 %2 'bar %4 ' %3" <= only return foo %1 %2 %3 as %4 is between '' "

我想匹配形式为%n的所有子字符串,其中n是一个数字以及空格前的第一个单词:

e、 g

将返回
foo%1%2%3

但是,字符串也可能有引号或反勾号,在下面的示例中,我不希望返回%4

"foo %1 %2    `bar %4` %3" <= only return foo %1 %2 %3
"foo %1 %2 'bar %4 ' %3" <= only return foo %1 %2 %3 as %4 is between ''
"foo %2 `bar  %1 quax`" <= only returns foo %2 as %1 is between ``
"foo %a %1" <= only returns foo %1
我不知道如何让它将“(%\d+\s*)位当作它自己的东西,并重复执行

Java正则表达式


谢谢,

您可以将此正则表达式与Java中的
\G
一起使用,以获取所有匹配项:


(?:^(?=.%\d+)(\w+)|)(?:匹配并使用
'…
或反勾带引号的字符串或
%在Java中,您可以将此正则表达式与
\G
一起使用,以获得所有匹配项:


(?:^(?=.*%\d+)(\w+)|(?:匹配并使用任何
“…”
的文本,或反勾带引号的字符串或
%从另一个角度考虑。与其检索未引用的部分,不如删除带引号的部分。然后,您可以应用正则表达式检索单个组,并过滤掉
%a
和空格之类的内容

String mayContainQuotes = ...;
String noQuotes = mayContainQuotes.replaceAll("`.*?`|'.*?'", " ");
Pattern.compile("^(\\w+)\\s+(%\\d+\\s*)*").matcher(noQuotes);

从另一个角度考虑。与其检索未引用的部分,不如删除引用的部分。然后,您可以应用正则表达式检索单个组,并过滤掉
%a
和空格等内容

String mayContainQuotes = ...;
String noQuotes = mayContainQuotes.replaceAll("`.*?`|'.*?'", " ");
Pattern.compile("^(\\w+)\\s+(%\\d+\\s*)*").matcher(noQuotes);

使用负回溯来禁止比赛前的回溯。阅读以了解如何使用回溯和前瞻。使用负回溯来禁止比赛前的回溯。阅读以了解如何使用回溯和前瞻。谢谢!无论如何,要使它匹配这里的%1?或者例如
foo%1:b%2
h%1和%2?如果您有
:b
字符串,则也可以使用此选项:谢谢!无论如何,要使其与
foo:a%1
此处的%1匹配?或者例如
foo%1:b%2
将匹配%1和%2?如果您有
:b
字符串,则也可以使用此选项:
String mayContainQuotes = ...;
String noQuotes = mayContainQuotes.replaceAll("`.*?`|'.*?'", " ");
Pattern.compile("^(\\w+)\\s+(%\\d+\\s*)*").matcher(noQuotes);