【问题标题】:Regular Expression Java Error正则表达式 Java 错误
【发布时间】:2011-10-29 07:54:19
【问题描述】:

我无法在 Java 上运行这个正则表达式:

 String regex = "/^{m:\"(.*)\",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})}$/";

String data = "{m:\"texttexttext\",s:1231,r:23123,t:1}";
Pattern p = Pattern.compile(regex_Write_clientToServer);

Matcher a = p.matcher(data);

在正则表达式站点的测试器(如http://gskinner.com/RegExr/)上,相同的正则表达式和相同的数据可以正常工作!

【问题讨论】:

    标签: java regex


    【解决方案1】:

    两个问题:

    1. 在 java 中,(与 perl 等不同)正则表达式不包含在 / 字符中
    2. 您必须转义您的 { 文字:

    试试这个:

    String regex = "^\\{m:\"(.*)\",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})\\}$";
    

    【讨论】:

      【解决方案2】:

      有两个问题:

      • 正斜杠不是模式本身的一部分,不应包含在内。
      • 您需要在开头和结尾处转义大括号,否则它们将被视为重复量词。在其他正则表达式实现中可能不是这种情况,但在 Java 中肯定是这种情况 - 当我尝试 just 删除斜杠时,Pattern.compile 出现异常。

      试试这个:

      String regex="^\\{m:\"(.*)\",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})\\}$";
      

      (适用于您的示例数据。)

      顺便说一句,如果这是为了解析 JSON,我个人会尝试用正则表达式来做 - 改用真正的 JSON 解析器。从长远来看,它会更加灵活。

      【讨论】:

      • 实际上,如果大括号不会被误解为 {m,n} 量词的一部分,则无需转义大括号。不过,最好还是这样做以避免混淆。
      • @TimPietzcker:是的,你这样做了——否则你会在Pattern.compile 中得到一个异常。我只知道这一点,因为我事先尝试过没有转义,并在异常中收到“索引 0 附近的非法重复”:)
      • 哦,有趣。那是Java的专长。其他正则表达式风格只是将其视为文字。
      【解决方案3】:

      两件事: Java 不要求您具有任何类型的开始/结束字符。所以你可以删除 / 字符

      此外,如果您想匹配任何正则表达式元字符,Java 要求您对其进行转义。在您的情况下,大括号字符 '{' 和 '}' 前面需要有一个双反斜杠(一个用于 java 转义,一个用于正则表达式转义):

      "^\\{m:\"(.*)\",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})\\}$"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-28
        • 2013-01-18
        • 2012-01-16
        相关资源
        最近更新 更多