Проблемы с регулярным выражением, соответствующие тегу HTML - PullRequest
1 голос
/ 17 марта 2012

Итак, я пытаюсь использовать sed (его нужно использовать в этих системах, поэтому, пожалуйста, не просто рекомендуйте использовать Perl), чтобы соответствовать HTML-тегу и получать содержимое из него.HTML-теги выглядят примерно так:

<div class="SectionText"> Received poor service or think your current mechanic is ripping you off? Get some help from <a href="http://www.union.umd.edu/gradlegalaid/index.htm" target="_blank">Graduate Legal Aid</a> or consult the <a href="http://www.oag.state.md.us/Consumer/index.htm" target="_blank">Maryland Attorney General Office of Consumer Protection</a> at <a href="mailto:consumer@oag.state.md.us">consumer@oag.state.md.us</a> or through their hotline at 410-528-8662 or 888-743-0023.<br /></div>

Все в одной строке.Итак, я написал этот ... Но он не работает.

sed 's/<div class=\"SectionText\">\([^<\/div>]*\)<\/div>/\1/g'

Это не меняет текст.

Я пытался использовать этот сайт в качестве руководства - http://www.ibm.com/developerworks/linux/library/l-sed2/index.html (в RegExp Snafus) \

Самое важное для этого сценария строки НЕ быть жадным и соответствовать до последнего

Ответы [ 2 ]

3 голосов
/ 17 марта 2012

Помимо попыток использовать регулярные выражения в html (см. RegEx соответствует открытым тегам, за исключением автономных тегов XHTML ), первые проблемы, которые я вижу, это:

[^<\/div>]*

Это означает совпадение с любыми символами , которые не <, /, d, i, v или >. И ясно, что у вас есть d и i там. ("Получи я ве д бедный серв ....")

Если вы используете для этого регулярное выражение и у вас есть очень контролируемый / прогнозируемый ввод, вы можете просто сделать [^<>], предполагая, что ваш текст не будет иметь эти персонажи. Но я вижу, что вы делаете, потому что у вас есть теги внутри вашего div ...

Но, если вы сделаете это:

sed 's/<div.class="SectionText">\(.*\)<\/div>/\1/g'

Это должно работать до тех пор, пока у вас нет нескольких </div> с. .* будет совпадать только до тех пор, пока не найдет <\/div>.

2 голосов
/ 17 марта 2012
[^<\/div>]*

Это не делает то, что вы думаете, что делает.Это соответствует любой последовательности символов, которые не <, /, d, i, v или >.

. В Perl вы можете просто использовать .*?, нопоскольку sed не поддерживает несжадные совпадения, вам нужно написать что-то вроде этого:

sed 's#<div class="SectionText">\(\([^<]\|<[^/]\|</[^d]\|</d[^i]\|</di[^v]\|</div[^>]\)*\)</div>#\1#g'

Это говорит о «любой последовательности символов, которая не является < или < неза которым следует /, или за </ не следует d и т. д.

Излишне говорить, что это нечитаемый, не поддерживаемый и почти не записываемый кусок дерьма, и вы почти наверняка этого не сделаетеиспользовать его, но если вы абсолютно, безусловно, должны использовать регулярные выражения для анализа HTML и, безусловно, должны использовать sed, то здесь вы идете.

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