【问题标题】:Java: PatternSyntaxException thrown with regex .*-\\d+{.*}\\d+-.*Java:使用正则表达式抛出 PatternSyntaxException .*-\\d+{.*}\\d+-.*
【发布时间】:2015-03-16 23:55:08
【问题描述】:

我正在尝试制作一个正则表达式来确定一个字符串是否包含一个-、一些数字、一个{、什么都没有/一些字符序列、一个}、一些数字和一个最终-。例如:

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+吗?

标签: java regex string match patternsyntaxexception


【解决方案1】:
String.matches("*-\\d+\\{.*}\\d+-.*");

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

【讨论】:

    【解决方案2】:

    模式将是:

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

    谢谢,

    【讨论】:

      【解决方案3】:

      模式应该是

      .*-\\d+\\{.*\\}\\d+-.*
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 哦,我没有注意到...但是是的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-22
        • 2019-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多