获取 java.util.regex.PatternSyntaxException:尝试将 String 替换为 rep



>我正在尝试将给定字符串中的单词与正则表达式匹配

{{ some | value }}

喜欢这个。

例如:

Hello {{ some | value }}, this is what i tried {{ another | value }}

我想从中提取

{{ some | value }} and {{ another | value }}

我尝试使用这种正则表达式模式Pattern.compile("\{\{(.*?)\}\}")

当我尝试迭代所有匹配并使用replaceAll替换时,我得到了java.util.regex.PatternSyntaxException: Illegal repetition.请帮助我克服这个问题。

我的代码

Pattern pattern                     = Pattern.compile("\{\{(.*?)\}\}");
Matcher matcher                     = pattern.matcher(text);
while(matcher.find()){
matches.add(matcher.group());
}
for (String match : matches) 
{
match = match.substring(2 , match.length()-2); // I WANT TO GET ONLY SOME | VALUE FROM THE PATTERN
String splitArray[] = match.split("\|");
String value1 = splitArray[0].trim();
String value2 = splitArray[1].trim();
text = text.replaceAll(match , value1);
}

您使用的方法似乎不必要地复杂。查看您的代码,您似乎想用some替换{{ some | value }},用another替换{{ another | value }]等等。那么为什么不这样做呢?

text = text.replaceAll("\{\{ (.+?) \| .+? \}\}", "$1");

这将匹配{{ ... | ... }}的所有实例,并将其替换为{{|之间的部分。

您需要的修复程序是将text = text.replaceAll(match , value1);替换为

text = text.replaceFirst(Pattern.quote(match), Matcher.quoteReplacement(value1));

它将match的第一次出现替换为value1其中matchvalue1都是文本字符串。

但是,我相信您想用关键部分替换所有{{...|...}},而不是实际收集所有匹配/捕获。然后,使用

text.replaceAll("\{\{\s*((?:(?!\{\{)[^|])*?)\s*\|\s*(.*?)\s*\}\}", "$1")

请参阅正则表达式演示。

  • {{-{{子字符串
  • s*- 0+ 空格
  • ((?:(?!{{)[^|])*?)- 第 1 组:除|、0 或更多以外的任何字符,但尽可能少重复,不开始{{序列
  • s*- 0+ 空格
  • |-|
  • s*- 0+ 空格
  • (.*?)- 第 2 组:任意 0+ 字符,尽可能少
  • s*- 0+ 空格
  • }}-}}子字符串。

请参阅Java演示:

String text = "Hello {{ some | value }}, this is what i tried {{ another | value }}";
text = text.replaceAll("\{\{\s*((?:(?!\{\{)[^|])*?)\s*\|\s*(.*?)\s*\}\}", "$1");
System.out.println(text);
// => Hello some, this is what i tried another

请注意,如果需要,您仍然可以使用Matcher#find()来提取捕获组值。

最新更新