0

文字列を文字列の配列に分割するJavaコードをいくつか書きます。まず、その文字列を regex pattern"\\,\\,|\\,"を使用して分割し、次に pattern を使用して分割します"\\,|\\,\\,"。最初の出力と 2 番目の出力に違いがあるのはなぜですか?

public class Test2 {
    public static void main(String[] args){

        String regex1 = "\\,\\,|\\,";
        String regex2 = "\\,|\\,\\,"; 

        String a  = "20140608,FT141590Z0LL,0608103611018634TCKJ3301000000018667,3000054789,IDR1742630000001,80507,1000,6012,TCKJ3301,6.00E+12,ID0010015,WADORI PURWANTO,,3000054789";
        String ss[] = a.split(regex1); 

        int index = 0; 
        for(String m : ss){
            System.out.println((index++)+ ": "+m+"|"); 
        }
    }
} 

使用時の出力regex1:

0: 20140608|
1: FT141590Z0LL|
2: 0608103611018634TCKJ3301000000018667|
3: 3000054789|
4: IDR1742630000001|
5: 80507|
6: 1000|
7: 6012|
8: TCKJ3301|
9: 6.00E+12|
10: ID0010015|
11: WADORI PURWANTO|
12: 3000054789|

そして使用する場合regex2

0: 20140608|
1: FT141590Z0LL|
2: 0608103611018634TCKJ3301000000018667|
3: 3000054789|
4: IDR1742630000001|
5: 80507|
6: 1000|
7: 6012|
8: TCKJ3301|
9: 6.00E+12|
10: ID0010015|
11: WADORI PURWANTO|
12: |
13: 3000054789|

この状況を処理するときに正規表現エンジンがどのように機能するかについて説明が必要です。

4

4 に答える 4

4

正規表現の仕組み: ステート マシンは常に左から右に読み取ります。,|,,== ,、常に最初の代替にのみ一致するため:

画像
(出典:gyazo.com

,,|,== ,,?:

バツ
(出典:gyazo.com


ただし、,,?バックトラッキングがないように代わりに使用する必要があります。

r
(出典:gyazo.com

于 2014-08-07T10:42:31.480 に答える
1

2 つの結果を見ると、split メソッドは最初に最初の式 (regex2 の場合は ","、regex1 の場合は ",,") を見つけて文字列を分割し、次に 2 番目の式を見つけようとするようですが、最初のパスの後にregex2 文字列に "," が 1 つも残っていません。そのため、regex2 で「,,」を読み取ると空文字列が検出されます。

したがって、正規表現が役立つようにするには、より複雑な式を最初に記述する必要があります。

于 2014-08-07T10:25:34.050 に答える
1

左から右に評価されます。ではregex1\\,\\,が最初に試行され、それ以外の場合\\,は が試行されます。そのため、12 番目の文字列は空ではありません\\,\\,。その場合は が一致するからです。の場合regex2、すべてが を使用して照合される\\,ため、空の文字列になります。

于 2014-08-07T10:25:57.690 に答える