2

ls -lRegexBuddyで出力をコンパイルするために2つのパターンを作成しましたが、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,})

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

2つ目はマッチング用です

マッチング用

-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)

2つ目は私に

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_]各正規表現で2つ。

 [\\[a-z_]

一部の正規表現の実装では、文字クラス内でエスケープする必要はありませんが、 「文字クラスは他の文字クラス内に表示される可能性が[ある」ため、Javaではエスケープできます。文字クラスの減算ドキュメントを参照してください。

ちなみに、タブに一致するように、すべての[0-9]withを置き換え、すべてのから\\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 に答える