Почему изменение этого класса регулярных выражений на. + Не обеспечивает совпадения? - PullRequest
0 голосов
/ 12 июля 2010

Если я использую это

string showPattern = @"return new_lightox\(this\);"">[a-zA-Z0-9(\s),!\?\-:'&%]+</a>";
MatchCollection showMatches = Regex.Matches(pageSource, showPattern);

, я получаю некоторые совпадения, но я хочу избавиться от [a-zA-Z0-9(\s),!\?\-:'&%]+ и использовать любой символ .+, но если я делаю это, у меня вообще нет совпадений.*

Что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 12 июля 2010

По умолчанию "."не соответствует переводу строки, но класс \ s соответствует.

2 голосов
/ 12 июля 2010

Чтобы позволить . совпадать с новой строкой, включите режим SingleLine / DOTALL - либо с помощью флага в вызове функции (как показывает ответ Абеля ), либо с помощью встроенного модификатора (?s), например, так: для всего выражения:

"(?s)return new_lightox\(this\);"">.+</a>"

Или только для определенной его части:

"return new_lightox\(this\);"">(?s:.+)</a>"


Возможно, было бы лучше сделать еще один шаг и сделать это:

"return new_lightox\(this\);"">(?s:(?!</?a).+)</a>"

Что должно препятствовать тому, чтобы закрывающая </a> принадлежала другой ссылке.

Однако, вам нужно быть очень здесь настороженно - неясно, что вы делаете в целом, но регулярное выражение не хороший инструмент для разбора HTML с, и может вызвать все виды проблем. Взгляните на использование анализатора HTML DOM вместо , например HtmlAgilityPack .

2 голосов
/ 12 июля 2010

Вы соответствуете тегу, так что вы, вероятно, хотите что-то вроде этих строк, вместо .+:

string showPattern = @"return new_lightox\(this\);"">[^<]+</a>";

Причина, по которой совпадение не происходит, возможно, потому что вы пропускаете многострочный / однострочный флаг и закрывающий тег находится на следующей строке.Другими словами, это должно работать тоже:

// SingleLine option changes the dot (.) to match newlines too
MatchCollection showMatches = Regex.Matches(
                              pageSource, 
                              showPattern, 
                              RegexOptions.SingleLine);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...