不必要的长正则表达式

时间:2016-08-01 13:15:10

标签: java regex

我有这个字符串模式我想要匹配。它可以包含两个花括号内的一些单词。这些花括号必须格式良好,不能嵌套。

例如:

I have this {{example}} which is right
Here {{is}} another {{example}} which is right
{{ This {{ example }} is wrong }}
{{ This }}example {{ is also { wrong }}

我构建了这个正则表达式似乎有效,但它很长,我认为它可以简化。

"^([^{}]*\\{\\{([^{}]*)\\}\\}[^{}]*)+$"

有什么方法可以简化这个吗?

2 个答案:

答案 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)); 
}