2

我创建了两个模式来编译ls -lRegexBuddy 中的输出,但在 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,})

第一个是为了匹配

-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,})");
    

第一个扔

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,})
4

2 回答 2

3

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

 [\\[a-z_]

一些正则表达式实现不需要[在字符类中进行转义,但 java 这样做是因为“字符类可能出现在其他字符类中”。请参阅字符类减法文档

[0-9]顺便说一句,您可以通过将所有替换为 并从所有 中\\d删除来缩短您的正则表达式,因为也匹配选项卡,并从您的字符类中删除所有逗号,例如应该是。\\t[\\t,\\s]\\s[-,r,w,x][-rwx]

如果你不担心匹配不区分大小写,你可以[a-z0-9_]\\w.

编辑

再看一遍,似乎没有理由[在字符类中有 ,所以[[a-z_]应该是[a-z_]

于 2013-02-24T20:11:33.847 回答
1

除了@Mike 所说的:

  1. 将 {1,} 替换为 +
  2. [a-z_][a-z0-9_]{0,30}你会搭配什么?当然不是 UNIX 文件名,因为这更像是[^\0/]+
于 2013-02-24T22:12:47.987 回答