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 件のコメント:
コメントを投稿