はじめに

こんにちは!

UiPathを利用した開発を行うにあたり、膨大なテキストデータの中から日付データだけを取得したい時はありませんか?

以前のブログでは正規表現を用いて特定の文字列を検索する方法をご紹介しましたが、正規表現にはまだまだ様々な活用方法があります。

今回は、正規表現を使って、文字列から日付データを抽出、取得する方法をご紹介します。

正規表現とは?~以前のブログ内容のおさらい~

まず正規表現について簡単におさらいをします。
正規表現とは、指定した条件に一致する複数の文字列を一つのパターンで表現する方法です。
Microsoftドキュメントでは次の通り説明がされています。

 正規表現とは

正規表現を使用すると、強力、柔軟、そして効率的な方法でテキストを処理できます。 正規表現によるパターン一致の広範な表記法を使用すると、大量のテキストをすばやく解析し、次のことを行うことができます。
 ➤ 特定の文字パターンを検索する
 ➤ テキストを検証して、定義済みのパターン (電子メール アドレスなど) と
   一致することを確実にする
 ➤ テキスト部分文字列の抽出、編集、置換、または削除を行う
 ➤ 抽出された文字列をコレクションに追加して、レポートを生成する

引用元:https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expressions

実際にやってみましょう!

今回はサンプルとして、サンプルテキストから日付(スラッシュor年月日区切り)のみを取得するプログラムを作成します。

プログラムでは.NET Frameworkで利用可能である正規表現表記を利用します。

① 事前準備~サンプルテキスト・正規表現パターンの設定~

まず、事前準備として、サンプルテキストとなる文字列を設定します。

サンプルテキストの内容は、以下の通りです。

種別サンプルデータ今回のプログラムでの取得可否
日付が含まれていない文字列“日付なしパターン”取得できない
全角数字「/(スラッシュ)」区切り
(yyyy/m/d)
“2020/4/1”取得できる
全角数字「.(ピリオド)」区切り
(yyyy.m.d)
“2020.4.1”取得できない
半角数字「年月日」区切り
(yyyy年mm月dd日)
“2020年04月01日”取得できる

そして、次は文字列から日付データのみを抽出するための正規表現パターンを設定します。

設定する正規表現パターンは、“(\d+)(年|/)(\d+)(月|/)(\d+)(日)?”です。
こちらは、今回使用した正規表現パターンについてで詳しく説明します。

②テキスト各行に対して繰り返し処理~一致する文字列を取得アクティビティ~

さて、いよいよここからが本番です。
サンプルテキストの各行に対して処理を行うために、シーケンス内に「繰り返し(コレクションの各要素)」を配置します。

今回のサンプルプログラムのテキストデータには全角数字と半角数字が混在しています。
そのため出力結果の見た目を整えることを目的として、「繰り返し(コレクションの各要素)」内のシーケンス(「本文」)の中へ、検索対象文字列の書式を半角に統一する処理を配置しました。
(正規表現による日付取得は、全角でも可能です。)

 StrConvメソッドとは?

指定に従って変換された文字列型の値を返します。

引用元:https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.strings.strconv?view=net-5.0

続いて、「一致する文字列を取得」アクティビティを配置します。

このアクティビティでは、取得したい文字列データに対応する正規表現パターンを設定することで、文字列から設定した正規表現パターンに合致した特定のデータを取得することができます。

一致する文字列を取得アクティビティとは?

入力文字列の中で正規表現のすべての出現箇所を検索し、正常な一致をすべて返します。このアクティビティには、正規表現ビルダー ウィザードが含まれています。

引用元:https://docs.uipath.com/activities/lang-ja/docs/matches

「一致する文字列を取得」アクティビティのプロパティはこちらのようになっています。

「結果」にはIEnumerable<Match>型の取得結果変数、「パターン」には正規表現表記、「入力」には検索対象文字列の変数が入ります。

「一致する文字列を取得」アクティビティを配置した後、IEnumerable<Match>型の取得結果変数をString型など他の型にキャストすれば日付を任意の型のデータとして処理に活用することができます。

そして、最後はエラー回避のために条件分岐を配置し、チェック対象行で正規表現に合致しなかった場合は繰り返しをコンティニューし次の行をチェックするようにしました。合致した場合は「1行を書き込み」アクティビティで結果を出力します。

③実行する

これでサンプルプログラムの準備が整いました。それでは実行してみましょう!
正規表現により日付を取得することに成功したら、「日付を取得しました。」という文字と共に、取得した日付が出力されます。

出力パネルには「日付を取得しました。」の文字と共に、「2020/4/1」と「2020年04月01日」の2行が出力されていることを確認することができました!

今回使用した正規表現パターンについて

今回使用した正規表現パターンについて説明します。
今回文字列から日付のみを抽出・取得するために、「一致する文字列を取得」アクティビティで設定した正規表現は、“(\d+)(年|/)(\d+)(月|/)(\d+)(日)?”でしたが、各記号のそれぞれの意味は以下の通りです。

文字説明
()グループ化を意味し、()に含まれる文字列を1つのパターンとして扱ったものに一致します
\d0~9までのすべての数字に一致します。
+直前の要素の 1 回以上の繰り返しに一致します。
|「|」で区切られた一連のパターンのいずれかに一致します。
?直前の要素の0回または1回の繰り返しに一致します。
※詳細についてはこちら(https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-language-quick-reference)を参照してください。

「\d+」は0~9までの数字の1回以上の繰り返し、つまり1桁以上の数字を意味し、さらに()を付けることでそれらを1つのまとまりと見なしています。
「(年|/)」は「年」という文字か「/」かのいずれかに一致していれば合致することを意味しています。「(月|/)」についても同様です。

つまり、今回の正規表現パターンは、「年」または「/(スラッシュ)」、「月」または「/」、そして「日」のそれぞれの直前に1桁以上の数字が存在する形式の文字列に合致することを意味しています。
ただし、「?」は0回または1回の繰り返しに一致を意味するので、「日」の文字はあってもなくても構いません。

例えば「2020/4/1」の場合、「2020」→「(\d+)」、「/」→「(年|/)」、「4」→「(\d+)」、「/」→「(月|/)」、「1」→「(\d+)」にそれぞれ対応しています。

ちなみに、サンプルプログラムでは「(年|/)」と「(月|/)」それぞれに「|」とピリオドを追加することでサンプルテキストの「2020.4.1」も取得することができるようになります。

補足~和暦日付の取得方法(正規表現)~

今回は西暦の日付を取得するプログラムでしたが、和暦日付を取得する場合は、先ほどの正規表現の先頭部分に「(元号)」を追加してください。

和暦のみ(令和2年4月1日)を取得するパターン:
(令和)(\d+)(年)(\d+)(月)(\d+)(日)

和暦と西暦(年月日・/区切り)を取得するパターン:
(令和)?(\d+)(年|/)(\d+)(月|/)(\d+)(日)?

まとめ

今回は、正規表現を使用して文字列から日付を取得する方法をご紹介しました。

皆様のUiPathを使ったプログラムの作成に少しでも役に立てば幸いです。

最後までお読みいただき、ありがとうございました!