регулярное выражение для анализа тега заголовка html

Мне нужно проанализировать множество html-файлов, чтобы узнать, какие из них содержат определенный текст в теге заголовка.

Предположим, что заголовки

file1.htm
<title>100 text other text</title>
file2.htm
<title>text 100 text other text</title>
file3.htm
<title>text 1000 text other text</title>
file4.htm
<title>text one hundred text other text</title>

Следуя моему примеру, мне нужно найти имена файлов, содержащие 100 или 100, то есть файлы 1,2 и 4.

Моя проблема в том, что я не знаю, как писать регулярное выражение

gci "c:\my_folder" | ? {$_.extension -eq ".htm"} | 
select-string -pattern '<title>*100*</title>' |
Select-Object -Unique Path

Обратите внимание, если это может быть важно для регулярного выражения, этот тег заголовка находится не в начале строки, а в середине. Заранее спасибо.


person Nicola Cossu    schedule 12.04.2011    source источник
comment
обычно использование регулярных выражений для анализа HTML — это плохо. просто к вашему сведению.   -  person Muad'Dib    schedule 12.04.2011
comment
Обязательное предупреждение об анализе HTML с использованием регулярных выражений: «regex соответствует открытым тегам, кроме автономных тегов xhtml»> stackoverflow.com/questions/1732348/   -  person Gareth McCaughan    schedule 12.04.2011
comment
Чтобы немного расширить этот момент: содержимое элемента title может занимать несколько строк; они могут содержать другую HTML-разметку. Разметка HTML в целом не подходит для обработки регулярных выражений из-за своей вложенной структуры. Возможно, в этом случае вы точно знаете, как были сделаны ваши входные файлы, и вы знаете, что заголовок всегда находится на одной строке и никогда не содержит ничего сложного. ЕСЛИ это так, то регулярные выражения не могут быть сумасшедшим подходом. В противном случае вам действительно следует использовать правильный парсер.   -  person Gareth McCaughan    schedule 12.04.2011
comment
Спасибо за ваши ответы. Я прочитал ссылку, но если это плохо, и я не могу их разобрать, у меня есть какая-то альтернатива? редактировать. Сейчас прочитал твой последний ответ.   -  person Nicola Cossu    schedule 12.04.2011
comment
Я ничего не знаю о PowerShell, но вы должны попробовать заменить * на .* в шаблоне. . соответствует любому символу. * означает любое количество вещей, соответствующих тому, что я только что сказал. Итак, .* означает любое количество произвольных символов. Но, повторяю, внимательно подумайте, действительно ли регулярные выражения подходят для этой работы.   -  person Gareth McCaughan    schedule 12.04.2011
comment
Еще раз спасибо, Гарет, за подробные ответы. Я буду искать альтернативу в Google, если powershell не подходит для этой работы.   -  person Nicola Cossu    schedule 12.04.2011
comment
Регулярные выражения — это весело! Но я настоятельно рекомендую потратить час или два на изучение основ. На странице www.regular-expressions.info есть отличный онлайн-учебник. Время, которое вы проведете там, многократно окупится. Удачного регулярного выражения!   -  person ridgerunner    schedule 12.04.2011


Ответы (2)


Это должно сделать это.

^.*<title>(.*(100|one\shundred)[^0].*)?</title>.*$
person jimplode    schedule 12.04.2011
comment
Могу я спросить вас, что означает [^0]? - person Nicola Cossu; 12.04.2011
comment
Не разрешать 1000, что 100+0 - person user unknown; 12.04.2011
comment
@nick rulez, как говорится в приведенном выше комментарии, это остановит его соответствие 1000, говорит, что не разрешается использовать 0 в качестве следующего символа. - person jimplode; 12.04.2011
comment
Ах хорошо. Теперь я понял. Еще раз спасибо за вашу доброту. :) - person Nicola Cossu; 12.04.2011
comment
Это решение (^.*<title>(.*(100|one\shundred)[^0].*)?</title>.*$) чрезмерно использует жадную точку-звезду! (Он выполняет МНОГО ненужной работы, особенно при тестировании длинных файлов, которые не совпадают.) И нет необходимости сопоставлять что-либо до или после элемента TITLE. Лучшее (и гораздо более быстрое) выражение было бы таким: <title>[^<]*?\b(100|one\s+hundred)\b[^<]*</title>. - person ridgerunner; 12.04.2011

пытаться

<title>(.*[^[:alnum:]])?(100|one hundred)([^[:alnum:]].*)?</title>

чтобы рисунок совпадал. синтаксис шаблона — PCRE (как в perl), при необходимости его можно переформулировать.

наилучшие пожелания,

Карстен

ps: остерегайтесь подводных камней - все рекомендации и предупреждения из комментариев остаются в силе; тем не менее, в вашем случае подход с регулярным выражением кажется жизнеспособным (в основном потому, что вы исследуете содержимое тега «заголовок», в файле должен быть только один тег, и распространение его по нескольким строкам было бы просто глупо имхо).

person collapsar    schedule 12.04.2011
comment
Спасибо коллапсар. Даже ваше решение кажется идеальным. Я тоже проголосовал за вас, но я принял ответ Джимплода, потому что он ответил первым. Еще раз спасибо. Вы гениальны. Боюсь, я никогда не выучу эти регулярные выражения. :( - person Nicola Cossu; 12.04.2011
comment
благодаря. однако имейте в виду, что решение, которое вы приняли, также будет соответствовать «‹название›одна сотая‹/название›», что может быть не тем, что вам нужно. гречц, карстен - person collapsar; 12.04.2011
comment
Спасибо за предупреждение. Как вы видели, я совсем новичок в регулярных выражениях, поэтому я не могу уловить эти маленькие подробности. :) У меня не будет сотой проблемы, потому что мой родной язык итальянский. Я изложил проблему на английском языке, чтобы все могли ее понять. Мне нужно было разобрать итальянские строки ;) Еще раз спасибо. - person Nicola Cossu; 12.04.2011