DOBON.NET DOBON.NETプログラミング掲示板過去ログ

正規表現のORパターンの並び順

環境/言語:[Windows 7 VB2008/2010]
分類:[.NET]

VB2008/2010で正規表現を使ってテキスト処理を行っているのですが、例えば、

(Imports System.Text.RegularExpressionsの前提で)
Dim txt As String = "今日は給料日なので給料を下ろしてこよう"
Dim ptn As String = "給料|給料日"

Dim ms as MatchCollection = Regex.Matches(txt, ptn)

とした場合、最初にマッチする文字は"給料日"となることを期待していたのですが、そうではなく、"給料"となり、"日"の部分をマッチしてくれません。

また、パターン文字列を

Dim ptn As String = "給料日|給料"

とすると、最初にマッチする文字は期待通りに"給料日"となります。

このことから、パイプ(|)を使ったORパターンの場合、マッチ結果がパターンの並び順によって変わるのですが、これは正規表現として正しい動きなのでしょうか?

実は、プログラム上でいくつかのキーワードをパイプ結合してパターン文字を生成し、文字検索を行っているのですが、この例では"給料日"が最初にマッチしてほしいにもかかわらず"給料"でマッチしてしまい、"給料日"の検索が抜けてしまうことが問題となっております。
このため、パイプ(|)を使ったORパターンを生成する場合、並び順を考慮することによって解決するものなのかどうかを確認したく、質問させて頂きました。
なお、パターン文字列はプログラムで行うので、"給料日?"のようなパターンを自動で作成することは面倒そうなので考えていません。

よろしくお願いします。
仕様として明記されています。
http://msdn.microsoft.com/ja-jp/library/36xybswe(v=VS.80).aspx
// なぜか.NET 4のドキュメントでは省略されてるけど。

.NET Frameworkの正規表現はPerl5互換ですが、同じルールのようですね。
http://fleur.hio.jp/perldoc/perl/5.9.5/pod/perlre.ja.html
ご回答ありがとうございました。
この動きはやはり仕様通りのものなのですね。
とりあえず、パターン文字生成時に、キーワードを文字数で降順ソートしたものを
結合することにより解決しましたのでご報告します。

大変お世話になりました。
また何かありましたらよろしくお願いします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板