我在RegexBuddy中创建了两个模式来编译ls -l
输出,但是在Android模式编译中给出了一个错误。在Java 7中它编译得很好。
原始模式是
(^[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,})
(^[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
在代码中:
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,})");
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,})
答案 0 :(得分:3)
对我来说,错误是通过转义[
个字符类中的[[a-z_]
来删除的 - 每个正则表达式都有两个。
[\\[a-z_]
某些正则表达式实现不需要在字符类中转义[
,但java会这样做,因为“字符类可能出现在其他字符类”中。请参阅Character class subtraction和docs。
顺便提一下,您可以通过将所有[0-9]
替换为\\d
并将所有\\t
中的[\\t,\\s]
移除为\\s
来缩短正则表达式匹配制表符,并删除字符类中的所有逗号,例如[-,r,w,x]
应为[-rwx]
。
如果您不担心匹配不区分大小写,则可以将所有[a-z0-9_]
替换为\\w
。
修改的
再看一下,似乎没有理由在角色类中使用[
,因此[[a-z_]
应该只是[a-z_]
。
答案 1 :(得分:1)
除了@Mike所说的:
[a-z_][a-z0-9_]{0,30}
你会怎么样?当然不是UNIX文件名,因为它更像是[^\0/]+