2015-01-14 4 views
0

Учитывая следующую строку:Извлечение нескольких вхождений подстроки с использованием Poweshell

'<p><a href="china">China</a><br><a href="india">India</a><br><a 
href="korea">Korea</a><br><a href="malaysia">Malaysia</a><br><a 
href="thailand">Thailand</a></p>' 

Я хотел бы использовать Powershell для извлечения всех стран, перечисленных в нем. Другими словами, я хочу вернуться @ (Китай, Индия, Корея, Малайзия, Таиланд).

Пытались с помощью регулярных выражений, но не может найти правильный шаблон, например:

'<p><a href="china">China</a><br><a href="india">India</a><br><a href="korea">Korea</a><br><a href="malaysia">Malaysia</a><br><a href="thailand">Thailand</a></p>' -match '(<a href="[A-Z a-z]*">[A-Z a-z]*</a>)+' 
$matches 

который возвращает:

Name       Value                                                
----       -----                                                
1        <a href="china">China</a>                                           
0        <a href="china">China</a> 

Есть предложения? Правильное ли регулярное выражение здесь?

P.S. Обратите внимание, что фрагмент не правильно сформирован, поэтому я не могу просто преобразовать его в XML.

ответ

2

$Matches автоматическая переменная содержит информацию о соответствующих групп захвата последнего -match операции, а не информации о спичках. Если вы хотите получить несколько матчей шаблон, то вы должны использовать метод Matches из [Regex] класса:

$InputString='<p><a href="china">China</a><br><a href="india">India</a><br><a href="korea">Korea</a><br><a href="malaysia">Malaysia</a><br><a href="thailand">Thailand</a></p>' 
$Pattern='<a href="[A-Z a-z]*">([A-Z a-z]*)</a>' 
$Countries=[Regex]::Matches($InputString,$Pattern)|ForEach-Object {$_.Groups[1].Value} 
$Countries 

Хотя для разбора HTML лучше использовать некоторые HTML анализатор, как other answer предложить вам.

+0

отлично, спасибо @petseral – jamiet

+0

так очевидно, что $ matches var не работал, как я ожидал – jamiet

+0

А я вижу. Еще раз спасибо. – jamiet

0

Следующая Regex должны сделать трюк:

(?<=><a\shref="\w+">)\w+ 

ML

+0

nope. https://twitter.com/jamiet/status/555278912918650881 – jamiet

0

Регулярные выражения никогда не являются хорошим способом обработки HTML (хотя часто они заманчивы). Вы можете анализировать HTML и извлекать нужные данные без использования какого-либо регулярного выражения:

PS C:\> $d = '<p><a href="china">China</a><br><a href="india">India</a><br><a 
href="korea">Korea</a><br><a href="malaysia">Malaysia</a><br><a 
href="thailand">Thailand</a></p>' 


PS C:\> $html = New-Object -ComObject "HTMLFile" 

PS C:\> $html.IHTMLDocument2_write($d) 

PS C:\> $html.getElementsByTagName('A') | select -expandProperty innerText 
China 
India 
Korea 
Malaysia 
Thailand 
+0

Ницца. Не знал о expandProperty. Спасибо Дункан. – jamiet

+0

В основном с Powershell 3 и более поздними версиями вам не нужно использовать 'expandProperty', поскольку вы обычно можете просто использовать точечную нотацию. Я не знаю, почему это не работает здесь: '($ html.getElementsByTagName ('A')). InnerText' ничего не дает, когда' $ html.getElementsByTagName ('A') | select -expandProperty innerText' отлично работает. Я думаю, это должно быть потому, что '$ html' является COM-объектом. – Duncan

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