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セットとする配列を作るりたい。つまり以下に分解したい。
単純に「,」で区切ると、Valueに「,」がいる場合もあるので正しく分解できない。
- String[] result = {
- "key1=value1",
- "key2=value2",
- :
- :
- "keyN=valueN"
- };
「,」で区切るが、後ろに「Key=」がある形で区切る必要がある。
つまりカンマ区切りと先読みを組み合わせる。
よって以下となる
以上!
- String str = "key1=XXXX,key2=Y,YYY,keyN=ZZZZ";
- String[] result = str.split(",(?=[^,]+=)");
- // 結果
- String[] result = {
- "key1=XXXX",
- "key2=Y,YYY",
- "keyN=ZZZZ"
- };
0 件のコメント:
コメントを投稿