2016-07-27 105 views
1

我有这样的文字:正则表达式匹配改进

<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://计算器.com/a/11656434/3832970的替代方法。 –

+1

关于用RegEx解析HTML,[请先阅读本文](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 
} 

正则表达式:

<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

' '对于提供的例子,这个工作步骤的数量大约是1/3,因为懒惰评估的速度非常慢。只要每个“​​”都在自己的行上,它就会工作,因为'.'通常不会消耗换行符。取决于正在解析的源。 – TemporalWolf

+0

那么提到。如果他想坚持使用正则表达式来解析他的html?他可能必须添加'[System.Text.RegularExpressions.RegexOptions]'... –

+0

我可以使用像'(。+?)<\/td>'{3}'这样的东西3次吗? – JustCurious