正则表达式匹配改进

时间:2016-07-27 07:02:05

标签: regex powershell

我有这样的文字:

<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

但我很安静,确保有更好的方法,而不是重复群组,不包括其他等等,以使用其他/更好的技术,我很乐意学习。< / p>

你的建议是什么?

1 个答案:

答案 0 :(得分: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>之间捕捉所有内容...