这个正则表达式有什么问题?

5

在Java中,我想要检测以下格式的字符串:可选下划线、大写字母,然后是括号包含的两个参数。例如像 MAX{1,2} FUNC{3,7} _POW{9,10} 这样的字符串。

我决定先不处理参数,所以我使用的正则表达式是:

_?[A-Z]+//{.*//}

但是当我试图将其编译为一个Pattern对象时,出现了以下错误:
Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition near index 9
_?[A-Z]+//{.*//}
         ^

有人知道问题是什么吗?

2个回答

19

你需要转义表达式中的花括号,否则它们会被视为重复操作符。我认为你需要使用\进行转义,而不是使用//


1
由于您是将其编写为Java字符串文字的形式,因此必须转义反斜杠:"_?[A-Z]+\\{.*\\}" - Alan Moore
@Alan:除非你使用一个“/”->“\”前端转换器来保持理智。 :) - tchrist

4

John是正确的。但你也不想使用'.*'贪婪模式匹配。下面是更好的正则表达式:

Pattern regex = Pattern.compile("_?[A-Z]+\\{[^}]+\\}");

请注意,在字符类内部,您不需要转义大括号。如果您想有效地使用正则表达式,这是您需要学习的基本语法。请参见:regular-expressions.info - (在此花费一小时将为您带来许多倍的回报!)

小建议。为了避免贪婪匹配,可以使用"勉强量词(?)"代替[^}]。例如:("_?[A-Z]+\{.*?\}")。有关更多信息,请访问https://dev59.com/bHM_5IYBdhLWcg3w-4nw。 - siddagrl
@siddagrl - 感谢您的建议,但是 [^}]+.*? 更高效(即更快),而且更准确。为了理解原因,我强烈推荐阅读:精通正则表达式(第三版). 干杯! - ridgerunner
哦!我不知道那个。谢谢分享。我会看一下的。 - siddagrl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接