Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式查找字符串中由%包围的变量_Java_Regex_String_Regex Lookarounds_Regex Group - Fatal编程技术网

Java 正则表达式查找字符串中由%包围的变量

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中实现这一点 人们都在问一些问题的答

需要在字符串中查找“变量”。表示变量的是%[/w]+%,关键是字符串中可以有多个变量:

%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)