我有这个字符串模式我想要匹配。它可以包含两个花括号内的一些单词。这些花括号必须格式良好,不能嵌套。
例如:
I have this {{example}} which is right
Here {{is}} another {{example}} which is right
{{ This {{ example }} is wrong }}
{{ This }}example {{ is also { wrong }}
我构建了这个正则表达式似乎有效,但它很长,我认为它可以简化。
"^([^{}]*\\{\\{([^{}]*)\\}\\}[^{}]*)+$"
有什么方法可以简化这个吗?
答案 0 :(得分:2)
做负面比赛会更容易。也就是说,寻找不允许的内容:
\\{\\{[^}]*\\{
并使用Matcher.find()。由于使用regex against XML is problematic的相同原因,尝试使用正匹配执行此操作很困难。
如果你想抓住大括号的内容,那就足够了
\\{\\{(\\w+\\)}\\}
答案 1 :(得分:1)
不清楚你的意思是什么?使模式更简单"。众所周知,良好的模式很长。较短的正则表达式很少精确。
在你的情况下,你不应该在字符类中使用{
和}
符号进行转义(在我第一次评论之后修复了它),并且你不需要在表达式中使用惰性量词< em>除非您正在使用捕获的值进行进一步处理。但是,您似乎没有使用它们,因此请使用:
"^([^{}]*\\{\\{([^{}]*)\\}\\}[^{}]*)+$"
请参阅Java demo:
String s = "I have this {{example}} which is right";
Pattern pattern = Pattern.compile("^([^{}]*\\{\\{([^{}]*)\\}\\}[^{}]*)+$");
Matcher matcher = pattern.matcher(s);
if (matcher.matches()){
System.out.println(matcher.group(0));
}