正则表达式查找字符串中被 % 包围的变量
regex to find variables surrounded by % in a string
需要在字符串中查找 "variables"。表示变量的是 %[/w]+%,问题是字符串中可以有多个变量:
%ABC%
%ABC%-%RED%
Lorem ipsum %GeT% sit amet, %% consectetur %QW23% elit.
在第三个示例中,不应找到 %%,它将被替换为单个 %。 #[\w+-]+# 之类的东西不起作用,因为它无法确定第二行是 %ABC% 和 %RED%,而是 %-%。我的印象是需要同时使用组和反向引用,但我在 Java.
中找不到任何好的示例来解释如何执行此操作
人们正在寻求一些问题的答案,所以在这里:
我期望的最终输出是什么?好吧,正如主题所暗示的那样,%ABC% 是在其他地方定义的 'variable',最终目标是 "find the variable and replace it with the correct value"。正则表达式的目标是找到字符串中的所有 'variables'。
因此,内存中某处有一张地图,其中:
ABC = "mike"
RED = "Red Storm"
GeT = "hometown"
QW23 = "Quick and easy"
(旁注:如果键的名称需要有 % 也可以)
正则表达式的目标是 'find' 变量,因此在第一个字符串中它会找到 ABC(或 %ABC%)以便代码和查找 ABC 以确定正确的值是迈克,等等......这是给定字符串的所需输出:
mike
mike-Red Storm
Lorem ipsum hometown sit amet, % consectetur Quick and easy elit.
我不希望 reg 表达式实际进行完整替换,而只是找到片段以便其他代码进行替换。我也不希望它将 %% 转换为 %,但不要管它,这样在事后对 %% 的简单搜索就可以将其转换为 %。
我相信您正在寻找正则表达式模式
(?<!%%)(?<=%)\w+(?=%)(?!%%)
这会找到每边都被一个 %
字符包围的变量。
测试正则表达式 here.
Java代码:
final Pattern pattern = Pattern.compile("(?<!%%)(?<=%)\w+(?=%)(?!%%)");
final Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group(0));
}
测试 Java 代码 here。
更新:
如果您想按照下面评论中的要求捕捉群组,请使用以下模式:
(?<!%)(%)(\w+)(%)(?!%)
测试这个模式here.
...和 Java 代码:
final Pattern pattern = Pattern.compile("(?<!%)(%)(\w+)(%)(?!%)");
final Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group(1) + " | " +
matcher.group(2) + " | " +
matcher.group(3));
}
测试这段代码here.
如果你想匹配 3 个捕获组中的变量,并且不想匹配 %%
,你可以使用交替 |
来匹配 %%
和捕获变量使用 3 个捕获组:
需要在字符串中查找 "variables"。表示变量的是 %[/w]+%,问题是字符串中可以有多个变量:
%ABC%
%ABC%-%RED%
Lorem ipsum %GeT% sit amet, %% consectetur %QW23% elit.
在第三个示例中,不应找到 %%,它将被替换为单个 %。 #[\w+-]+# 之类的东西不起作用,因为它无法确定第二行是 %ABC% 和 %RED%,而是 %-%。我的印象是需要同时使用组和反向引用,但我在 Java.
中找不到任何好的示例来解释如何执行此操作人们正在寻求一些问题的答案,所以在这里:
我期望的最终输出是什么?好吧,正如主题所暗示的那样,%ABC% 是在其他地方定义的 'variable',最终目标是 "find the variable and replace it with the correct value"。正则表达式的目标是找到字符串中的所有 'variables'。
因此,内存中某处有一张地图,其中:
ABC = "mike"
RED = "Red Storm"
GeT = "hometown"
QW23 = "Quick and easy"
(旁注:如果键的名称需要有 % 也可以)
正则表达式的目标是 'find' 变量,因此在第一个字符串中它会找到 ABC(或 %ABC%)以便代码和查找 ABC 以确定正确的值是迈克,等等......这是给定字符串的所需输出:
mike
mike-Red Storm
Lorem ipsum hometown sit amet, % consectetur Quick and easy elit.
我不希望 reg 表达式实际进行完整替换,而只是找到片段以便其他代码进行替换。我也不希望它将 %% 转换为 %,但不要管它,这样在事后对 %% 的简单搜索就可以将其转换为 %。
我相信您正在寻找正则表达式模式
(?<!%%)(?<=%)\w+(?=%)(?!%%)
这会找到每边都被一个 %
字符包围的变量。
测试正则表达式 here.
Java代码:
final Pattern pattern = Pattern.compile("(?<!%%)(?<=%)\w+(?=%)(?!%%)");
final Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group(0));
}
测试 Java 代码 here。
更新:
如果您想按照下面评论中的要求捕捉群组,请使用以下模式:
(?<!%)(%)(\w+)(%)(?!%)
测试这个模式here.
...和 Java 代码:
final Pattern pattern = Pattern.compile("(?<!%)(%)(\w+)(%)(?!%)");
final Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group(1) + " | " +
matcher.group(2) + " | " +
matcher.group(3));
}
测试这段代码here.
如果你想匹配 3 个捕获组中的变量,并且不想匹配 %%
,你可以使用交替 |
来匹配 %%
和捕获变量使用 3 个捕获组: