目次
はじめに
こんにちは!
UiPathを使用して開発を行っていると、「特定の文字列パターンに一致しない文字列」を検索したい!という時はありませんか?
文字列の検索方法には、主なものとして「String.Containsメソッド」を使用する方法があります。
指定した部分文字列がこの文字列内に存在するかどうかを示す値を返します。
引用元:https://docs.microsoft.com/ja-jp/dotnet/api/system.string.contains?view=net-5.0
この「String.Containsメソッド」では「指定した部分文字列」が「検索対象となる文字列」に存在する場合に「True」を返却することはできますが、「特定の文字列パターンには一致しない文字列」を正しく検索することができません。
例えば、以下のテキストデータリストから「基準日yyyy年m月d日」の文字列が含まれる要素だけを取得するプログラムを作るとします。
※「yyyy」及び「m」、「d」はデータによって可変することを想定しています。
pdfTextDataList = String[3]
{
(1)基準日公告日2021年4月30日(金曜日),
(2)基準日2021年5月20日(木曜日),
(3)効力発生日2021年5月21日(金曜日)
}
今回検索したい「基準日yyyy年m月dd日」のうち、不変である特定の文字列は「基準日」であるため、「String.Containsメソッド」を使用する場合は「検索したいキーワード」に「基準日」を指定するしかありません。
しかし、「検索キーワード」を「基準日」にすると、以下の出力結果のように、<Containsメソッドによる検索結果>として「基準日yyyy年m月d日」の他に「基準日公告日yyyy年m月d日」の文字列も表示されてしまいます。

「基準日公告日yyyy年m月d日」が合致せずに、「基準日yyyy年m月d日」のみが合致するようにするにはどうすればよいでしょうか?
こちらのブログでは、正規表現を利用して、テキストデータから省きたいキーワードを指定して文字列を検索する方法をご紹介します。
正規表現とは?
正規表現を使用すると、強力、柔軟、そして効率的な方法でテキストを処理できます。 正規表現によるパターン一致の広範な表記法を使用すると、大量のテキストをすばやく解析し、次のことを行うことができます。
➤ 特定の文字パターンを検索する
➤ テキストを検証して、定義済みのパターン (電子メール アドレスなど) と
一致することを確実にする
➤ テキスト部分文字列の抽出、編集、置換、または削除を行う
➤ 抽出された文字列をコレクションに追加して、レポートを生成する
引用元:https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expressions
例えば、[1-9]という正規表現を例に出します。
「[…](角括弧)」は、角括弧に含まれる文字のいずれか1文字と合致することができるという意味を持つので、こちらの正規表現の場合、文字列の中に1から9までのいずれか1つの数字が含まれていれば、正規表現のパターンに合致するということになります。
例)正規表現[1-9]を使用して文字列を検索した場合、結果は次の通りです。
5 ⇒ 一致 ◎
0 ⇒ 不一致 ×
a ⇒ 不一致 ×
実際にやってみましょう!
① 「文字列の一致をチェック」アクティビティの配置
UiPathで、「文字列の一致をチェック」アクティビティを配置してください。

こちらで正規表現を設定することができます。
プロパティパネルの「結果」には「Boolean型」の変数を、「パターン」には「String型」の正規表現記述を、「入力」には今回の検索対象となるテキストデータの「String型」の変数を設定します。

結果の「Boolean型」変数は、「検索対象となる文字列(item.ToString)」に「正規表現のパターンに一致する文字列」が含まれていた場合、「True」の値が返却されます。
今回は、「パターン」に記入する正規表現記述に「”^(?=.*基準日)(?!.*公告日).*$“」を入力することで、「公告日」という文字列を含まない「基準日」という文字列を含む行を検索することができます!
② 否定先読みで特定の文字列を含まずに検索する
正規表現で特定の文字列を含まないように文字列を検索する記述は、
^(?=.*検索したい文字列)(?!.*含んではいけないキーワード).*$
です。
こちらの、「?!」から始まる正規表現記述を、「否定先読み」といいます。

ちなみに、「否定先読み」部分以外の正規表現についての説明は以下の通りです。
記号 | 説明 |
---|---|
?= | 肯定先読みの正規表現記述です。 |
^ | 文字列の先頭を意味し、行の先頭に存在する場合に限定して検索します。 |
$ | 文字列の最後を意味し、行の末尾に存在する場合に限定して検索します。 |
.* | 該当箇所に任意の1文字が存在しないか、連続して存在するかのどちらの場合も許可して抽出します。 |
() | グループ化を意味しており、()に含まれる文字列を一つの文字として扱います。 |
③ 実行する
今回は、検索対象となるテキストデータから「基準日yyyy年m月d日」を取得するために、「基準日」というキーワードで検索を行う場合を想定します。
検索をかけるテキストデータは、containsメソッドのご説明で使用したものと同じです。

プログラムの流れは以下の通りです。
「String[]型」のテキストデータに対して、「繰り返し(コレクションの各要素)」の中で1行ずつ検索を行い、結果が「True」であれば合致した文字列を出力します。

それでは、実際に実行してみましょう。
検索対象となっていたテキストデータに対し、正規表現による検索結果には、「(2)基準日2021年5月20日(木曜日)」のみが出力されました!

このように、含めたくない文字列を正規表現の「否定先読み」で指定することで、検索したい文字列のみを検索することができます。
その表現の幅広さゆえ、完璧に使いこなすのはなかなか難しいですが、正規表現を使用することによってより精度の高いデータ処理を行うことが可能になりますので、是非活用してみてください。
まとめ
今回は、正規表現の否定先読みを使用して特定の文字列を含まない文字列検索の方法をご紹介しました。
皆様のUiPathを使ったプログラムの作成に少しでも参考になれば幸いです。
最後までお読みいただき、ありがとうございました!