2009-04-03 9 views
4

私の会社が使用するC#アプリケーションは、データベーステーブルから正規表現の文字列を取り出し、別のテキストファイルでそれらを照合することです。問題は、アプリケーションにRegexOptionsがデフォルトとして設定されておらず、「Dot matches new line」モードを使用する必要があることです。.NET正規表現エンジンはインラインモード修飾子をサポートしていますか?

はちょうど

"A(?s)(.*?)(?-s)B" 

またはPHP

"/A(.*?)B/s" 

答えて

1

のように、 "グローバル" モード修飾子はいなどのエンジンサポートインラインモード修飾子を行います。 hereを参照してください。

(?s:) 

シングルラインモードをオンにする必要があります。

2

確かにそうです(インラインモード修飾子をサポートしています)!

モード修飾子(?s:)を使用して、ドット文字を改行に一致させる「シングルラインモード」をオンにするだけです。

.NETフレーバーで正規表現がどのように機能するかを確認するには、.NET Regexエンジンを使用するRAD Regex Designerを使用すると便利です。

+0

私はより多くのregexbuddyが好きです:) – knoopx

+0

はい、私もそうですが、RegexbuddyはすべてのRegexの味と機能をサポートしています。 – Cerebrus

3

別にRegexOptionsコンパイラフラグから、そこ修飾子の/sスタイルのための直接対応はませんが、あなたはあなたの正規表現の先頭にインライン修飾子を配置することによって、同じ効果を得ることができます。

"(?s)A(.*?)B" 

うインライン修飾子には2つの形式があることに注意してください。あなたの例で使用したもの:

"A(?s)(.*?)(?-s)B" 

...コロンがありません。 (?s)は、(?-s)が再びオフになるまで、DOTALLモードをオンにするスイッチに過ぎません。コロンの付いた他のバージョンは実際には非捕捉グループ(?:...)であり、モードスイッチが組み込まれています。モードスイッチはそのグループ内の正規表現の一部が制御されている間のみ有効です。そのバージョンを使用して、あなたの例では、まだキャプチャグループを使用したい場合は、

"A(?s:.*?)B" 

になる...かになります。

"A(?s:(.*?))B" 

あなたは2つのバージョンをアップミックスする必要はありません。あなたは、このような元の正規表現を記述した場合:

"A(?s:)(.*?)(?-s:)B" 

...それが例外をスローしないだろうが、意図したとおり、それは動作しません。 (?s:)は、単にDOTALLモードでは何も一致しません。(?-s:)は、DOTALLモードではまったく一致しません。

+0

ああ、正規表現の謎! – Cheeso

関連する問題