模式编译错误

时间:2013-02-24 19:17:24

标签: java android regex

我在RegexBuddy中创建了两个模式来编译ls -l输出,但是在Android模式编译中给出了一个错误。在Java 7中它编译得很好。

原始模式是

  1. (^[l,d,-][-,r,w,x]{9})[\t,\s]{1,}([[a-z_][a-z0-9_]{0,30}|[0-9]{1,})[\t,\s]{1,}([[a-z_][a-z0-9_]{0,30}|[0-9]{1,})[\t,\s]{1,}([0-9]{0,})[\t,\s]{1,}([0-9]{4}-[0-9]{1,2}-[0-9]{1,2}\s[0-9]{2}:[0-9]{2})[\t,\s]{1,}(.{1,})
  2. (^[l,d,-][-,r,w,x]{9})[\t,\s]{1,}[0-9]{1,}[\t,\s]{1,}([[a-z_][a-z0-9_]{0,30}|[0-9]{1,})[\t,\s]{1,}([[a-z_][a-z0-9_]{0,30}|[0-9]{1,})[\t,\s]{1,}([0-9]{0,})[\t,\s]{1,}(\w{3}\s[0-9]{1,2}[\t,\s]{1,}([0-9]{1,2}:[0-9]{2}|[0-9]{4}))[\t,\s]{1,}(.{1,})
  3. 第一个是匹配

    -rwxr-xr-x  1 doctor users    399 2011-11-11 13:33 shot.s
    

    -rwxr-xr-x  1 100 100    399 2011-11-11 13:33 file.txt
    

    第二个是匹配

    匹配

    -rwxr-xr-x  1 doctor users    399 Nov 22  2011 shot.s
    

    -rwxr-xr-x  1 100 100    399 Nov 22 13:33 shot.s
    

    在代码中:

    1. private static final Pattern LS_L =
          Pattern.compile("(^[l,d,-][-,r,w,x]{9})[\\t,\\s]{1,}([[a-z_][a-z0-9_]{0,30}|[0-9]{1,})[\\t,\\s]{1,}([[a-z_][a-z0-9_]{0,30}|[0-9]{1,})[\\t,\\s]{1,}([0-9]{0,})[\\t,\\s]{1,}([0-9]{4}-[0-9]{1,2}-[0-9]{1,2}\\s[0-9]{2}:[0-9]{2})[\\t,\\s]{1,}(.{1,})");
      
    2. private static final Pattern LS_L_1 =
          Pattern.compile("(^[l,d,-][-,r,w,x]{9})[\\t,\\s]{1,}[0-9]{1,}[\\t,\\s]{1,}([[a-z_][a-z0-9_]{0,30}|[0-9]{1,})[\\t,\\s]{1,}([[a-z_][a-z0-9_]{0,30}|[0-9]{1,})[\\t,\\s]{1,}([0-9]{0,})[\\t,\\s]{1,}(\\w{3}\\s[0-9]{1,2}[\\t,\\s]{1,}([0-9]{1,2}:[0-9]{2}|[0-9]{4}))[\\t,\\s]{1,}(.{1,})");
      
    3. 第一个抛出

      02-24 21:14:21.854: E/AndroidRuntime(3072): Caused by: java.util.regex.PatternSyntaxException: Missing closing bracket in character class near index 219:
      02-24 21:14:21.854: E/AndroidRuntime(3072): (^[l,d,-][-,r,w,x]{9})[\t,\s]{1,}([[a-z_][a-z0-9_]{0,30}|[0-9]{1,})[\t,\s]{1,}([[a-z_][a-z0-9_]{0,30}|[0-9]{1,})[\t,\s]{1,}([0-9]{0,})[\t,\s]{1,}([0-9]{4}-[0-9]{1,2}-[0-9]{1,2}\s[0-9]{2}:[0-9]{2})[\t,\s]{1,}(.{1,})
      02-24 21:14:21.854: E/AndroidRuntime(3072):                                                                                                                                                                                                                            ^
      02-24 21:14:21.854: E/AndroidRuntime(3072):     at java.util.regex.Pattern.compileImpl(Native Method)
      02-24 21:14:21.854: E/AndroidRuntime(3072):     at java.util.regex.Pattern.compile(Pattern.java:400)
      02-24 21:14:21.854: E/AndroidRuntime(3072):     at java.util.regex.Pattern.<init>(Pattern.java:383)
      02-24 21:14:21.854: E/AndroidRuntime(3072):     at java.util.regex.Pattern.compile(Pattern.java:374)
      

      第二个给了我

      02-24 21:00:24.166: E/AndroidRuntime(1366): Caused by: java.util.regex.PatternSyntaxException: Missing closing bracket in character class near index 250:
      02-24 21:00:24.166: E/AndroidRuntime(1366): (^[l,d,-][-,r,w,x]{9})[\t,\s]{1,}[0-9]{1,}[\t,\s]{1,}([[a-z_][a-z0-9_]{0,30}|[0-9]{1,})[\t,\s]{1,}([[a-z_][a-z0-9_]{0,30}|[0-9]{1,})[\t,\s]{1,}([0-9]{0,})[\t,\s]{1,}(\w{3}\s[0-9]{1,2}[\t,\s]{1,}([0-9]{1,2}:[0-9]{2}|[0-9]{4}))[\t,\s]{1,}(.{1,})
      

2 个答案:

答案 0 :(得分:3)

对我来说,错误是通过转义[个字符类中的[[a-z_]来删除的 - 每个正则表达式都有两个。

 [\\[a-z_]

某些正则表达式实现不需要在字符类中转义[,但java会这样做,因为“字符类可能出现在其他字符类”中。请参阅Character class subtractiondocs

顺便提一下,您可以通过将所有[0-9]替换为\\d并将所有\\t中的[\\t,\\s]移除为\\s来缩短正则表达式匹配制表符,并删除字符类中的所有逗号,例如[-,r,w,x]应为[-rwx]

如果您不担心匹配不区分大小写,则可以将所有[a-z0-9_]替换为\\w

修改

再看一下,似乎没有理由在角色类中使用[,因此[[a-z_]应该只是[a-z_]

答案 1 :(得分:1)

除了@Mike所说的:

  1. 用+
  2. 替换{1,}
  3. [a-z_][a-z0-9_]{0,30}你会怎么样?当然不是UNIX文件名,因为它更像是[^\0/]+