.NET Regex не совпадает в коде, работает в каждом тестировании - PullRequest
4 голосов
/ 05 мая 2009

Это настоящий скребок для меня ...

var matches = Regex.Matches("<p>test something<script language=\"javascript\">alert('hello');</script> and here's <b>bold</b> and <i>italic</i> and <a href=\"http://popw.com/\">link</a>.</p>", "</?(?!p|a|b|i)\b[^>]*>");

Предполагается, что Regex захватывает любой тег HTML (открытый или закрытый), который не является p, a, b или i. Я подключил входную строку и регулярное выражение к бесчисленным страницам тестирования, и каждая из них возвращает тег сценария (открыть и закрыть) как совпадающие. Но это абсолютно не работает в коде. Переменная match имеет счетчик 0.

Я что-то упускаю невероятно очевидное?

Ответы [ 2 ]

8 голосов
/ 05 мая 2009

Вы забыли избежать обратной косой черты в строке шаблона.

"</?(?!p|a|b|i)\\b[^>]*>"
0 голосов
/ 05 мая 2009

(?! ) - негативный прогноз. Он соответствует нулевым символам, если содержащийся в нем шаблон не соответствует текущей позиции.

(?!p|a|b|i)\\b будет смотреть на следующий символ, чтобы увидеть, соответствует ли он p|a|b|i. Если это произойдет, прогноз не сможет ничего соответствовать. Если содержащийся шаблон не соответствует, упреждающий просмотр выполняется успешно, и он пытается найти следующий токен в шаблоне из той же позиции. В этом случае слово границы.

То, что вы хотите, вероятно, примерно так:

@"</?(?!(?:p|a|b|i)\b)\w+[^>]*>"

Он ожидает что-то, что соответствует (?:p|a|b|i)\b. Если этот шаблон не соответствует, упреждающий просмотр завершается успешно, и он будет соответствовать по крайней мере одному слову-символу, за которым следует любое количество символов до закрытия ">".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...