2012-05-10 2 views
4

У меня есть следующее очень простое регулярное выражение, которое соответствует HTML-тегам в строке. У меня есть параметр, нечувствительный к регистру, так что капитализация тегов не имеет значения. Однако, когда параметр «скомпилирован» установлен, опция «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

Вы используете побитовое И для своих флагов, вы должны использовать побитовое ИЛИ.

Этот бит:

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

Смежные вопросы