2022年2月14日月曜日

String#splitで区切り文字を要素に入れる

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=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 件のコメント:

コメントを投稿