2012-05-10 9 views
4

文字列のHTMLタグに一致する以下の非常に単純な正規表現があります。私は大文字と小文字を区別しないオプションを設定しているので、タグの大文字と小文字は関係ありません。しかし、 'compiled'オプションが設定されている場合、 'IgnoreCase'オプションは無視されるようです。'コンパイル済み'オプションが指定されている場合、Regex 'Ignore Case'オプションは機能しません

サンプルコード:

string text = "<SPAN>blah</SPAN><span>blah</span>"; 
Regex expr1 = new Regex("</*span>", RegexOptions.IgnoreCase); 
Regex expr2 = new Regex("</*span>", RegexOptions.IgnoreCase & RegexOptions.Compiled); 

MatchCollection result1 = expr1 .Matches(text); 
//gives 4 matches- <SPAN>,</SPAN>,<span> & </span> 
MatchCollection result2 = expr2 .Matches(text); 
//only gives 2 matches- <span> & </span> 

誰もがここで何が起こっているかのアイデアを持っていますか?

+1

別に質問から、 "'は '" より良い正規表現ではないでしょうか? – Hinek

+0

はい、もう少し考えてみたら、がおそらく良いでしょう。 – John

答えて

15

フラグにビット単位のANDを使用している場合は、ビット単位のORを使用する必要があります。

このビット:

RegexOptions.IgnoreCase & RegexOptions.Compiled 

は次のようになります。

RegexOptions.IgnoreCase | RegexOptions.Compiled 

Here is a good article on how flags and enumerations work in respect to C#.

+1

私はいつもその間違いをします。私は私の旗を書いているし、大声で "私はオプションA **と**オプションBがほしいと言います..." – ean5533

+1

それは非常に有用で有益な記事、ありがとう。 – John