2015-07-08 4 views
0

У меня есть RegEx, ниже которого находятся предопределенные теги html и их свойства, такие как src | href | action. Она содержит группы, которые синтаксический анализ строки, как этотRegEx с независимой группой

разобранные строки:

<a data-mydata href="myUrl"></a> 

Извлеченные группы:

[0] {<a data-mydata href="myUrl">} 
[1] {} 
[2] {<a data-mydata href="} 
[3] {myUrl} 
[4] {">} 
[5] {} //<- Empty result, the data-mydata is not read 

RegEx:

(?<pre><(?:script|img|a|area|link|base|input|frame|iframe|form)\\b.*?(?:src|href|action)\\s*=\\s*[\"']\\s*)(?<url>.+?)(?<post>\\s*[\"'][^>]*?>)|(?<data>(data-mydata)) 

Проблема заключается в том, что я хочу, чтобы проверить атрибут data-mydata но group 5 возвращение пустой результат {}. data-mydata атрибут является необязательным, но мне нужно знать, data-mydata существует или нет.

+2

Почему вы не используете HtmlAgilityPack для анализа HTML? Я бы сказал, что это будет намного проще. –

+0

Это не мое решение, и я не могу его изменить, я должен использовать RegEx. – Tomas

+0

С помощью HtmlAgilityPack вы можете собрать всю информацию о тегах и их атрибутах и ​​проверить все, что вам нужно. Действительно, это быстрее и безопаснее N раз, чем при попытке с регулярным выражением. Должен ли я предложить решение на основе HtmlAgilityPack? –

ответ

0

Если у вас есть матч вы можете извлечь группу 5 и посмотреть, если это успех

match.Groups[5].Success 

или имени

match.Groups["data"].Success 

Также убедитесь, что предшествующая группа не жадностью соответствия до конца tag(), добавить? до конца группы так он останавливается в конце открывающего тега

(?<tag><a\s(?<data>data-mydata)?)?.*(?<end><\/a>) 

это работает, чтобы соответствовать 3 группы внутри, обратите внимание на одну группы вложена жгутами других в качестве дополнительного матча (?)

<a data-mydata href="myUrl"></a> 

соответствует

tag  [0-15] `<a data-mydata ` 
data [3-15] `data-mydata ` 
end  [28-32] `</a>` 

и

<a href="myUrl"></a> 

tag [0-3] `<a ` 
end [16-20] `</a>` 
+0

Проблема, что Группа 5 всегда возвращает значение null. Я думаю, что я использую | (? (data-mydata)) неправильно. – Tomas

+0

используйте имя его именованной группы так, чтобы match.Groups ["data"]. Успех – BhavO

+0

Как и ожидалось, с match.Groups ["data"]. Успех я получаю False, потому что что-то не так с RegEx и данными группы не захватывает. – Tomas

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