Могу ли я дополнительно оптимизировать свой Regex или я все делаю правильно? - PullRequest
2 голосов
/ 13 ноября 2009

Хорошо, я работаю с html и хочу сопоставить все между двумя комментариями, генерируемыми CMS, включая разрывы строк.

Пример:

<!-- Start Magic -->
<h2>My title</h2>
<p>Here's some content</p>
<p>And hey look, a linebreak!
And here's another for good measure!
</p>
<!-- End Magic -->

А вот регулярное выражение, которое я использую для извлечения кишок:

Regex.Match(magic, @"<!-- Start Magic -->(?<guts>[\s\S]*?)<!-- End Magic -->");

Теперь я должен отметить, что это на самом деле работает нормально. Мне просто интересно, является ли использование [\s\S]*? лучшим способом сопоставления всего (включая разрывы строк) без жадности.

Ответы [ 3 ]

4 голосов
/ 13 ноября 2009

Есть еще один метод, использующий RegexOptions, показанный ниже:

Regex.match(magic, @"<!-- Start Magic -->.*?<!-- End Magic -->", RegexOptions.SingleLine);

С помощью RegexOptions.SingleLine вы информируете механизм регулярных выражений C # о необходимости изменить значение точки, чтобы она соответствовала каждому символу (вместо значения по умолчанию, которое соответствует каждому символу, исключая \ n)

Это не относится к «лучшему» способу сделать это, так как это довольно субъективно, включая такие аспекты, как производительность и удобочитаемость.

1 голос
/ 13 ноября 2009

Я полагаю, \s\S эквивалентно ., если вы используете модификатор ignore-whitespace, если это возможно в C #.

0 голосов
/ 13 ноября 2009

Если вы хотите сопоставить все не жадным образом,

@"<!-- Start Magic -->(.*?)<!-- End Magic -->"

должно работать. Не проверяйте это все же.

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