2016-07-27 14 views
1

Ich habe diesen Text:Regex Match Improvement

<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> 

Ich möchte die <td class=...> </td> auch alles zwischen dem <td> </td> fangen

Was erreicht I ist diese regex:

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

Danach Ich muss immer noch alle <td> Übereinstimmungen ausschließen:

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

Schließlich erhalte ich diese Ergebnisse:

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 

Aber ich bin ruhig sicher, dass es ein besserer Weg, anstatt die Gruppen von duplizieren, ohne Sachen usw. einig andere/bessere Technik zu verwenden, was ich Ich werde glücklich sein zu lernen.

Was ist Ihr Vorschlag?

+0

Siehe http: // Stackoverflow .com/a/11656434/3832970 für eine alternative Methode. –

+1

In Bezug auf das Analysieren von HTML mit RegEx, [lesen Sie das zuerst] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) –

Antwort

2

können Sie [regex]::Matches verwenden, um mehrere Spiele zu bekommen (statt \n der Verwendung):

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

Regex:

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

Regular expression visualization

Ausgang:

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> 

Hinweis: Sie wollen wahrscheinlich die href in einem weiteren Schritt extrahieren oder durch die Regex Einstellung - aber die Frage war über alles zwischen <td> fangen ...

+1

' ] *> (. +) <\/td> 'Für das angegebene Beispiel funktioniert dies in etwa 1/3 der Anzahl der Schritte, da faule Auswertungen notorisch langsam sind. Es funktioniert so lange, wie jede '' sich in einer eigenen Zeile befindet, da' .' normalerweise keine Zeilenumbrüche enthält. Kommt nur auf die zu analysierende Quelle an. – TemporalWolf

+0

Gut erwähnt. Wenn er bei Regex bleiben möchte, um sein HTML zu parsen? er muss wahrscheinlich hinzufügen '[System.Text.RegularExpressions.RegexOptions]' ... –

+0

Kann ich etwas wie '' (. +?) <\/td> '{3} 'für 3 mal zum Beispiel verwenden? – JustCurious