2016-07-27 3 views
1

У меня есть этот текст:Regex матч Улучшение

<td class="devices-user-name">devicename</td> 
      <td>192.168.133.221</td> 
      <td>Storage Sync</td> 
      <td>10.3.3.335</td> 
      <td>Active</td> 
      <td>7/26/2016 8:39PM</td> 
      <td class="devices-details-button"><a class="btn btn-mini" href="#settings/devices/1/239a9cd0-d6c9-4e7d-9918-0cd686a57aac">Details</a></td> 

Я хочу, чтобы поймать все между <td> </td> а также <td class=...> </td>

То, что я достиг это регулярное выражение:

<td.*>(.*?)<\/td>(\n(.*<td>(.*?)<\/td>))(\n(.*<td>(.*?)<\/td>))(\n(.*<td>(.*?)<\/td>))(\n(.*<td>(.*?)<\/td>))(\n(.*<td>(.*?)<\/td>))(\n(.*<td.*href="(.*?)")) 

После этого Мне все еще нужно исключить все совпадения <td>:

$MatchResult = $Matches.GetEnumerator() | ? {$_.Value -notmatch 'td'} | Sort Name 

Наконец я получаю эти результаты:

Name       Value 
----       ----- 
1        devicename 
4        192.168.133.221 
7        Storage Sync 
10        10.3.3.335 
13        Active 
16        7/26/2016 8:39PM 
19        #settings/devices/1/239a9cd0-d6c9-4e7d-9918-0cd686a57aac 

Но я тихо уверен, что есть лучший способ, вместо того, чтобы дублировать группы, за исключением вещей и т.д., чтобы использовать другие/лучшие техник, которые я будем рады узнать.

Какое ваше предложение?

+0

См Http: // StackOverflow .com/a/11656434/3832970 для альтернативного метода. –

+1

Что касается разбора HTML с RegEx, прочитайте это сначала (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) –

ответ

2

Вы можете использовать [regex]::Matches, чтобы получить несколько матчей (вместо использования \n):

$content = Get-Content 'your-File' 
[regex]::Matches($content , '<td.*?>(.+?)<\/td>') | ForEach-Object { 
    $_.Groups[1].Value 
} 

Regex:

<td.*?>(.+?)<\/td> 

Regular expression visualization

Выход:

devicename 
192.168.133.221 
Storage Sync 
10.3.3.335 
Active 
7/26/2016 8:39PM 
<a class="btn btn-mini" href="#settings/devices/1/239a9cd0-d6c9-4e7d-9918-0cd686a57aac">Details</a> 

Примечание: Вы, вероятно, хотите, чтобы извлечь HREF в другой стадии или путем регулирования регулярных выражений - но вопрос был о ловле все между <td> ...

+1

' ] *> (. +) <\/td> 'В приведенном примере это примерно 1/3 число шагов, так как ленивые оценки, как известно, медленны. Он будет работать до тех пор, пока каждый '' находится в собственной строке, так как '.' Обычно не будет использовать новые строки. Просто зависит от того, как источник разбирается. – TemporalWolf

+0

Хорошо упомянуто. Если он хочет использовать регулярное выражение для анализа его html? он, вероятно, должен добавить '[System.Text.RegularExpressions.RegexOptions]' ... –

+0

Могу ли я использовать что-то вроде '' (. +?) <\/td>' {3}' в течение трех раз? – JustCurious