>我正在尝试将给定字符串中的单词与正则表达式匹配
{{ 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
其中match
和value1
都是文本字符串。
但是,我相信您想用关键部分替换所有{{...|...}}
,而不是实际收集所有匹配/捕获。然后,使用
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()
来提取捕获组值。