Java 正则表达式查找字符串中由%包围的变量
需要在字符串中查找“变量”。表示变量的是%[/w]+%,关键是字符串中可以有多个变量:Java 正则表达式查找字符串中由%包围的变量,java,regex,string,regex-lookarounds,regex-group,Java,Regex,String,Regex Lookarounds,Regex Group,需要在字符串中查找“变量”。表示变量的是%[/w]+%,关键是字符串中可以有多个变量: %ABC% %ABC%-%RED% Lorem ipsum %GeT% sit amet, %% consectetur %QW23% elit. 在第三个示例中,不应找到%%,它将替换为单个%。像#[\w+-]+#这样的东西不起作用,因为它无法确定第二行中的%ABC%和%RED%,而是%-%。我的印象是需要使用组和反向引用,但我找不到任何好的例子来解释如何在Java中实现这一点 人们都在问一些问题的答
%ABC%
%ABC%-%RED%
Lorem ipsum %GeT% sit amet, %% consectetur %QW23% elit.
在第三个示例中,不应找到%%,它将替换为单个%。像#[\w+-]+#这样的东西不起作用,因为它无法确定第二行中的%ABC%和%RED%,而是%-%。我的印象是需要使用组和反向引用,但我找不到任何好的例子来解释如何在Java中实现这一点
人们都在问一些问题的答案,所以你来: 我对最终输出的期望是什么?好吧,正如主题所暗示的那样,%ABC%是一个在其他地方定义的“变量”,最终目标是“找到变量并用正确的值替换它”。正则表达式的目标是查找字符串中的所有“变量” 因此,内存中的某个地方有一张地图,其中:
ABC = "mike"
RED = "Red Storm"
GeT = "hometown"
QW23 = "Quick and easy"
(旁注:如果键的名称周围需要有%,也可以)
正则表达式的目标是“查找”变量,因此在第一个字符串中它将查找ABC(或%ABC%),以便代码和查找ABC以确定正确的值是mike,依此类推。。。以下是给定字符串的期望输出:
mike
mike-Red Storm
Lorem ipsum hometown sit amet, % consectetur Quick and easy elit.
我并不期望reg表达式实际执行完全替换,而是简单地查找片段以便其他代码执行替换。我也不希望它将%%转换为%,但请别管它,这样在事实发生后,只需简单搜索%%即可将其转换为%。我相信您正在寻找正则表达式模式
(?<!%%)(?<=%)\w+(?=%)(?!%%)
测试Java代码
更新: 如果您想按照下面评论中的要求捕获组,请使用以下模式:
(?<!%)(%)(\w+)(%)(?!%)
(?
测试此模式
…和Java代码:
final Pattern pattern = Pattern.compile("(?<!%%)(?<=%)\\w+(?=%)(?!%%)");
final Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group(0));
}
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));
}
final Pattern Pattern=Pattern.compile((?如果您想匹配3个捕获组中的变量,而您不想匹配%%
,您可以使用一个替代|
来匹配%%
并使用3个捕获组捕获变量:
那么%%可以嵌套吗?如果是这样,一个regexp无法处理,那么您需要一个解析器。我看不出%\w+%
在哪里,为什么您要在需要%%
的时候使用磅号
呢?这个regex%(\w+)有什么问题吗%
?我的最终目标是有三个组,0、1和2,其中0组是开头,1组是内部文本,2组是结尾。在您的java示例中,它只有一个组,相当于我想要的1组。如何更改正则表达式,从而有三个组?@SamCarleton-Group(0)
始终表示整个模式/匹配。捕获组从索引号1开始:组(1)
,组(2)
,组(3)
。