Java: 正则表达式抛出 PatternSyntaxException .*-\\d+{.*}\\d+-.*

Java: PatternSyntaxException thrown with regex .*-\\d+{.*}\\d+-.*

我正在尝试制作一个正则表达式来确定字符串是否包含 -、一些数字、{、nothing/some 字符序列、}、一些数字和最后的 -。例如:

gibberish-345{randomtext}938475-moregibberish

^&*^%^asdf-9897689{symbols$%&*}456-h6

-456{}456-

我尝试过使用 String.matches("*-\d+{.*}\d+-.*")String.matches("*-[\d]+{.*}[\d]+-.*"),但在每种情况下我都得到了 PatternSyntaxException(它们都在下面):

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition near index 5
.*-\d+{.*}\d+-.*
 ^
at java.util.regex.Pattern.error(Unknown Source)
at java.util.regex.Pattern.closure(Unknown Source)
at java.util.regex.Pattern.sequence(Unknown Source)
at java.util.regex.Pattern.expr(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.util.regex.Pattern.<init>(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.util.regex.Pattern.matches(Unknown Source)
at java.lang.String.matches(Unknown Source)
at conv.Congine.qual(Congine.java:17)
at conv.Congine.convert(Congine.java:5)
at conv.Main.main(Main.java:6)

~

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition near index 7
.*-[\d]+{.*}[\d]+-.*
   ^
at java.util.regex.Pattern.error(Unknown Source)
at java.util.regex.Pattern.closure(Unknown Source)
at java.util.regex.Pattern.sequence(Unknown Source)
at java.util.regex.Pattern.expr(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.util.regex.Pattern.<init>(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.util.regex.Pattern.matches(Unknown Source)
at java.lang.String.matches(Unknown Source)
at conv.Congine.qual(Congine.java:17)
at conv.Congine.convert(Congine.java:5)
at conv.Main.main(Main.java:6)

我是否使用了我不知道自己正在使用的正则表达式符号?我检查过,但我认为 -、{ 或 } 不符合正则表达式符号的条件...

看来我可以回答我自己的问题...显然 {} 是正则表达式中的 特殊字符,你必须转义它们\。好吧。

模式应该是

.*-\d+\{.*\}\d+-.*
String.matches("*-\d+\{.*}\d+-.*");

主要是因为+符号旁边的{字符。我们都知道,在正则表达式中,+ 重复前一个标记一次或多次,而重复量词 {start,end} 根据 {} 大括号内给定的范围重复前一个标记。因此,正则表达式引擎将 { 视为重复量词的开始,而 { 之前的 + 会导致此操作失败。我们不能指定 o+{2},但可以指定 (o+){2}。而且你不需要转义右大括号。

模式将是:

^.*[-]\d+\{.*\}\d+[-].*$

谢谢,