соответствие регулярных выражений <value>с CRLF - PullRequest
1 голос
/ 11 февраля 2012

Я пытаюсь просканировать веб-страницу и получить все интересные элементы с регулярным выражением, включая следующий термин:

<font\s+face=""Arial"">(?<value>.+)</font>

Я не очень хорошо понимаю, почему перед моим "" стоит "?" , если кто-то может мне объяснить (этот синтаксис работает).

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

var value = m.Groups["value"].Value;

Моя единственная проблема - когда <значение> включает CRLF , это не соответствует, даже если я указываю "RegexOptions.Multiline" в C #.

Спасибо за ваши ответы.

Ответы [ 3 ]

1 голос
/ 11 февраля 2012

Круглые скобки соответствуют части регулярного выражения, (?<name>pattern) назначает имя соответствующей круглой скобке, поэтому вы можете ссылаться на совпадение с помощью ...Groups["value"]... вместо номера совпадения, как обычно в случае срегулярное выражение

Используйте RegexOptions.SingleLine для решения вашей проблемы;(DOTALL в других вариантах регулярного выражения).

Чтобы уточнить: RegexOption.MultiLine меняет значение ^ и $, RegexOptions.SingleLine означает .;Я нашел полный список здесь: http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx

0 голосов
/ 12 февраля 2012

Я решил свою проблему, используя этот синтаксис:

(?<value>.+(\n.*)?)

, но теперь я не понимаю ничего другого.Почему, когда у меня есть эта строка:

style='font-family:Arial; font-size:10pt; mso-bidi-font-size:10.0pt;mso-bidi-font-family:"Times New Roman"'>Milord</span></b></p>

Термин "Милорд" не совпадает в с этим шаблоном:

style='font\-family\:Arial;\s+font\-size\:10pt;\s+mso\-bidi\-font\-size\:10\.0pt;mso\-bidi\-font-family\:\n?"Times\s+New\s+Roman"'>(<font\s+face="Arial">?)(?<value>.+(\n.*)?)(</font>?)</span></b></p>

, хотя я указал эти строки как необязательные

(<font\s+face="Arial">?)
(</font>?)

Я действительно не понимаю, я пробовал так много синтаксиса с разными местами для "?"и ничто не является моим ожидаемым результатом!

0 голосов
/ 11 февраля 2012

Диалекты Regex отличаются, но для вашей проблемы newline ищите флаги Regex, называемые MULTILINE и / или DOTALL.

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

Я не могу ответить на часть угловых скобок, я думаю, что она специфична и для вашего диалекта Regex (в C #)

...