0

正規表現を使用して文字列をフィールドに分割しようとしていますが、残念ながら 100% 機能しておらず、分割する必要がある部分をスキップしています。プログラム処理文字列の一部を次に示します。

void parser(String s) {
    String REG1 = "(',\\d)|(',')|(\\d,')|(\\d,\\d)";
    Pattern p1 = Pattern.compile(REG1);
    Matcher m1 = p1.matcher(s);
while (m1.find() ) {

            System.out.println(counter + ":  "+s.substring(end, m1.end()-1)+" "+end+   "  "+m1.end());
            end =m1.end();
        counter++;
    }
}

文字列は次のとおりです。

s= 3101,'12HQ18U0109','11YX27X0041','XX21','SHV7-P Hig, Hig','','GW1','MON','E','A','ASEXPORT-1',1,101,0,'0','1500','V','','',0,'mb-master1'

そして問題は、それが分割されないこと,1,です,0,

解析のルールは次のとおりです。文字列は次 ,' ',のよう,'ASEXPORT-1', intに囲まれています。, ,

期待される出力 =

3101   |   12HQ18U0109  |  11YX27X0041  | XX21    |  SHV7-P Hig, Hig|  |GW1   |MON  |E  |  A|   ASEXPORT-1|  1  |101   |0   |  0  |1500  |   V|    |   |   0   |mb-master1

全部で 21 の要素。

4

2 に答える 2

4

この正規表現で分割できます

,(?=([^']*'[^']*')*[^']*$)

,が偶数の場合のみ分岐する'


だから

3101,'12HQ18,U0109','11YX27X0041'

出力は

3101
'12HQ18,U0109'
'11YX27X0041'

ノート

..のようなネストされた文字列'hello 'h,i'world'では機能しません。そのような場合は、次の正規表現を使用する必要があります

(?<='),(?=')|(?<=\d),(?=\d|')|(?<=\d|'),(?=\d)
于 2013-05-23T07:42:31.420 に答える
0

また、(何らかの奇妙な理由で) 元の文字列の各一致の開始インデックスと終了インデックスを知る必要がある場合 (サンプル出力にあるように)、次のパターンを使用できます。

String regex = "('[^']*'|\\d+)";

これは、引用符のない整数または単一引用符で囲まれた文字列に一致します。必要に応じて、一致する部分文字列で「2 番目のパス」を使用し
て先頭と末尾を削除できます。'

match = match.replaceAll("\\A'|'\\Z", "");

これは、先頭と末尾を何も置き換え'ません。

コードは次のようになります。

Pattern pat = Pattern.compile("('[^']*'|\\d+)");
Matcher m = pat.matcher(str);

int counter = 0, start = 0;
while (m.find()) {
    String match = m.group(1);
    int end = start + match.length();
    match = match.replaceAll("\\A'|'\\Z", "");   // <-- comment out for NOT replacing 
                                                 //     leading and trailing quotes 
    System.out.format("%d: %s [%d - %d]%n", ++counter, match, start, end);
    start = end + 1;   // <-- the "+1" is to account for the ',' separator
}

この短いデモも参照してください。

于 2013-05-23T08:21:28.117 に答える