2022年2月14日月曜日

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

java言語のString#splitを使い文字列を配列に分解する時、

引数で指定した文字列は配列から消えるが、要素内に入れたい場合がある。

例えば

  1. String str = "{あいうえお}{かきくけこ}{さしすせそ}";
  2. // これを{}を残したまま以下のように分解したい
  3. String[] result = {
  4. "{あいうえお}",
  5. "{かきくけこ}",
  6. "{さしすせそ}"
  7. };

正規表現の「先読み」「後読み」を使うことで対応できる。


先読みで対応する方法

上記の例だと単純に「{」で分解すると、「{」が要素から消えて

  1. String str = "{あいうえお}{かきくけこ}{さしすせそ}";
  2. String[] result = str.split("\\{");
  3.  
  4. // 結果
  5. String[] result = {
  6. "",
  7. "あいうえお}",
  8. "かきくけこ}",
  9. "さしすせそ}"
  10. };
という配列になってしまう。

先読みという以下の正規表現を使うと、「パターン」に入れた文字が次の配列に入る

(?=パターン)

よってこう書ける

  1. String str = "{あいうえお}{かきくけこ}{さしすせそ}";
  2. String[] result = str.split("(?=\\{)");
  3.  
  4. // 結果
  5. String[] result = {
  6. "{あいうえお}",
  7. "{かきくけこ}",
  8. "{さしすせそ}"
  9. };


後読みで対応する方法

先読みと同じように以下の正規表現を使うとよい。

(?<=パターン)

こっちは「パターン」に入れた文字が今の配列の末尾になる。

よってこう書ける

  1. String str = "{あいうえお}{かきくけこ}{さしすせそ}";
  2. String[] result = str.split("(?<=\\})");
  3.  
  4. // 結果
  5. String[] result = {
  6. "{あいうえお}",
  7. "{かきくけこ}",
  8. "{さしすせそ}"
  9. };


応用

「key1=value1,key2=value2,...keyN=valueN」という文字列がある。
・keyは1文字以上であり、「,」「=」以外の文字列で形成される
・valueは0文字以上であり、「=」以外の文字列で形成される

「key=value」を1セットとする配列を作るりたい。つまり以下に分解したい。

  1. String[] result = {
  2. "key1=value1",
  3. "key2=value2",
  4. :
  5. :
  6. "keyN=valueN"
  7. };
単純に「,」で区切ると、Valueに「,」がいる場合もあるので正しく分解できない。 
「,」で区切るが、後ろに「Key=」がある形で区切る必要がある。
つまりカンマ区切りと先読みを組み合わせる。
よって以下となる
  1. String str = "key1=XXXX,key2=Y,YYY,keyN=ZZZZ";
  2. String[] result = str.split(",(?=[^,]+=)");
  3.  
  4. // 結果
  5. String[] result = {
  6. "key1=XXXX",
  7. "key2=Y,YYY",
  8. "keyN=ZZZZ"
  9. };
以上!




0 件のコメント:

コメントを投稿