java言語のString#splitを使い文字列を配列に分解する時、
引数で指定した文字列は配列から消えるが、要素内に入れたい場合がある。
例えば
String str = "{あいうえお}{かきくけこ}{さしすせそ}"; // これを{}を残したまま以下のように分解したい String[] result = { "{あいうえお}", "{かきくけこ}", "{さしすせそ}" };
正規表現の「先読み」「後読み」を使うことで対応できる。
先読みで対応する方法
上記の例だと単純に「{」で分解すると、「{」が要素から消えて
String str = "{あいうえお}{かきくけこ}{さしすせそ}"; String[] result = str.split("\\{"); // 結果 String[] result = { "", "あいうえお}", "かきくけこ}", "さしすせそ}" };という配列になってしまう。
先読みという以下の正規表現を使うと、「パターン」に入れた文字が次の配列に入る
よってこう書ける
String str = "{あいうえお}{かきくけこ}{さしすせそ}"; String[] result = str.split("(?=\\{)"); // 結果 String[] result = { "{あいうえお}", "{かきくけこ}", "{さしすせそ}" };
後読みで対応する方法
先読みと同じように以下の正規表現を使うとよい。
こっちは「パターン」に入れた文字が今の配列の末尾になる。
よってこう書ける
String str = "{あいうえお}{かきくけこ}{さしすせそ}"; String[] result = str.split("(?<=\\})"); // 結果 String[] result = { "{あいうえお}", "{かきくけこ}", "{さしすせそ}" };
応用
「key1=value1,key2=value2,...keyN=valueN」という文字列がある。
・keyは1文字以上であり、「,」「=」以外の文字列で形成される
・valueは0文字以上であり、「=」以外の文字列で形成される
・keyは1文字以上であり、「,」「=」以外の文字列で形成される
・valueは0文字以上であり、「=」以外の文字列で形成される
「key=value」を1セットとする配列を作るりたい。つまり以下に分解したい。
String[] result = { "key1=value1", "key2=value2", : : "keyN=valueN" };単純に「,」で区切ると、Valueに「,」がいる場合もあるので正しく分解できない。
「,」で区切るが、後ろに「Key=」がある形で区切る必要がある。
つまりカンマ区切りと先読みを組み合わせる。
よって以下となる
String str = "key1=XXXX,key2=Y,YYY,keyN=ZZZZ"; String[] result = str.split(",(?=[^,]+=)"); // 結果 String[] result = { "key1=XXXX", "key2=Y,YYY", "keyN=ZZZZ" };以上!
0 件のコメント:
コメントを投稿