はじめに
Blue Prism で、一定の書式に従った文字列をパースする際に、正規表現を使いたい場面があり、「名前付きキャプチャ」を利用する方法を調べてみました。
「名前付きキャプチャ」とは、例えば Python では「名前つきグループ」と呼ばれているもので、下記のように名前を指定した「マッチ部分」の文字列を取り出して利用できるようにするものです。
>>> m = re.match(r'(?P<first>\w+) (?P<last>\w+)', 'Jane Doe')
>>> m.groupdict()
{'first': 'Jane', 'last': 'Doe'}
Utility - Strings::Extract Regex Values の使い方を調べる
インストールするとついてくる Utility 系のVBO に、「Utility - Strings」があり、その中のアクションの「Extract Regex Values」が名前的にも使えそうです。
VBO のマニュアルをみてみます。
なるほど、わからん。。。
仕方がないので、Utility - Strings VBO の本体をみてみると、オブジェクトに用例としてデータアイテムの初期値が入っており、テスト実行して動きが確認できるようになっています。これは助かりますね!
使い方のポイントは、引数の コレクションNamed Values にあります。
列名に Name Value をもつコレクションを準備し、その Name 列に、正規表現で設定した名前付きキャプチャの「名前」を指定します。
用例での正規表現は下記の通りです。設定されている名前付きキャプチャは Lower と Upperです。
(?<Lower>\d+)\s*(-|to)\s*(?<Upper>\d+)
Lower と Upper を Name 列に設定します。
実行すると、結果が Value 列に入る仕組みになっているようです。
テスト対象の文字列は、下記の通りなので、意図通りのキャプチャができています。
100-200
これで使い方がわかりました。
Utility - Strings::Extract Regex Values を使ってみる
試しに使ってみます。
テスト対象の文字列を下記のように設定し、角括弧の中身と、角括弧に続く文字列をそれぞれ別にキャプチャしてみます。
[場所] 東京都品川区西五反田
使うパターン文字列は下記の通りです。角括弧の中身を Tag、角括弧に続く文字列を Content としてキャプチャしようとしています。
^\[(?<Tag>\w+)\]\s*(?<Content>.+)$
ポイントとなるコレクション Named Values Input は下記のように Name列、Value列を設定し、Name列の初期値に、名前付きパターンの Tag、Content を設定します。
実行すると、意図通りキャプチャできたことがわかります。
まとめ
VBO のマニュアルをみても使い方がわからない場合も、本体をみると分かることがある!
