【Salesforce】【Apex】正規表現でテキスト内から指定文字列を複数取得する


きっかけ

テキストエリア項目の中に不定なフォーマットで5桁数値キーが複数入っているので
そのキーを1つずつキー1~キー50の項目にセットしてほしい。

という感じのご要望があったので実装しました。ApexにもPatternクラスがあるのでこれを使用します。

今回は 正規表現でテキストの中から指定文字列を取得し、指定文字列リストを返すメソッド の紹介です。

Patternクラス(正規表現)を使用した処理については、もう一つ記事を書いていますのでこちら↓もご参考ください。
【Salesforce】【Apex】正規表現で年月テキストから月末日を取得する

仕様

テキストエリア項目の値(不定フォーマット5桁数値キー)の例
ID:32541 ID:32542 ID:32543 ID:32544 ID:32545
キー発行20331,20332,20333,20334
①53452②53453③53454
株式会社ぴえぴえ商事様のキーは78891です。

これらの値を引数にいれて、正規表現で5桁数値を取得しリストに格納し返します。

コード

メソッドを置いておきます。
使用したいクラスにコピペして呼び出せば使用できると思います。
正規表現は取りたい値によって直してください。

public static List<String> getKeyList(string text){

    // 5桁数値の正規表現
    String regex = '(\\d{5})';

    // 正規表現をPatternにコンパイルし、textに一致するMatcherを作成する
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(text);

    List<String> keyList = new List<String>();
    while(m.find()){
        // マッチした文字列をリストに追加
        keyList.add(m.group());
    }

    return keyList;

}

while(m.find())で次のマッチを探しています。

Patternクラスのリファレンスから引用です。find()について

このメソッドは Matcher オブジェクトのリージョンの最初から開始します。または、前のメソッド呼び出しが成功し、Matcher オブジェクトがそれ以降リセットされていない場合、前のマッチ処理で一致しなかった最初の文字から開始します。

結果

例に挙げた値を渡して匿名実行し、system.debug(keyList)したログを載せておきます。

ID:32541 ID:32542 ID:32543 ID:32544 ID:32545

キー発行20331,20332,20333,20334

①53452②53453③53454

株式会社ぴえぴえ商事様のキーは78891です。

いい感じに取れました!
項目に転記するなどの処理は戻り値listをfor文で回したり適宜どうぞ。

参考