2016-03-21 12 views
0

Ich analysiere durch eine CSV in zwei Kategorien zu exportieren: Übereinstimmungen und NonMatches über Powershell.Regex gegen einen ungeraden Wert

Die Daten im CSV ist als der folgende formated:

SamAccountName 
xx9999xx 
aa0000aa 
ab0909xc 
etc

Ich brauche einen regulären Ausdruck, der mir erlaubt, alle Spiele zu filtern, die die aa0000bb Namenskonvention und exportieren, die in eine csv folgen (gleiche mit denen, die nicht der Konvention aa0000bb entsprechen) Konvention (weil es ungerade ist): die ersten 2 sind Buchstaben von az, dann 4 Zahlen 0-9, dann 2 Buchstaben az. Das heißt, Sie Ich habe aa0000aa und by7690zi

Gerade jetzt haben:

Import-Csv "C:\Path\to\csv" | ForEach { 
$Name =$_.SamAccountName; 
$Name -Match '[a-z]+[a-z]+[0-9]+[0-9]+[0-9]+[0-9]+[a-z]+[a-z]'} | Out-Null; $Matches 

oder

ForEach ($Name in $CSV) 
{ 
    If ($Name -Match '[a-z]+[a-z]+[0-9]+[0-9]+[0-9]+[0-9]+[a-z]+[a-z]') 
     { 
     Write-Host "$Matches" 
     }else{ 
     Write-Host "No Match" 
     } 
} 

Beide scheinen ausgeben zufällige Dinge, die nicht korrekt sind. Ich denke (hoffe wirklich), dass es einen Weg gibt, durch den folgenden entsprechen:

a-z #For the first set of letters 
0-9 #For the 4 digits 
a-z #For the second set of letters 

ie [a-z{2}]+[0-9{4}]+[a-z{2}] 

Ich kann laufen, ein normales 'xx9999xx' -Match '[a-z]+[a-z]+[0-9]+[0-9]+[0-9]+[0-9]+[a-z]+[a-z]' und es gibt true zurück, und dann

PS C:\Windows> $Matches 

Name       Value                                                 
----       -----                                                 
0        xx9999xx 

Aber ich immer noch don verstehe nicht, wie man das massenhaft macht.

+0

Können Sie Beispieleingänge und -ausgänge bereitstellen? Gibt es mehrere aa0000aa pro Eingabezeile? – Arluin

+0

@Arluin - Nein, es ist ein einzigartiger Wert, also nur eine Instanz von aa0000aa, der nächste Wert wäre aa0000ab usw. – Benny

Antwort

2

Korrekte Regex zu Ihrer Konvention sollte wie folgt sein.

Regex:[a-z]{2}[0-9]{4}[a-z]{2}

Regex101 Demo

+1

Also war mein Gedanke nah dran! Danke Noob :) – Benny

2

noob hat eine richtige regex Ihr Problem entsprechen. Um zu verstehen, warum deins mehr als erwartet übereinstimmte, liegt das daran, dass das Pluszeichen ein Quantifizierer-Metazeichen in Regex ist. Es bedeutet

Zwischen einem und beliebig oft, so oft wie möglich, je nach Bedarf

etwas zurückzugeben Wenn Sie also mehr Zahlen als zwei haben es versuchen würde, mehr entsprechen. So würde dies eine gültige Begegnung

aaaa00000000000aaaa 

eine feste quantifier Mit {2}, {4} usw. genau passt auf, was Sie wollen.

Regex101.com ist eine großartige Ressource für schnelles Testen. Es gibt auch eine sehr gute Erklärung Ihrer Regex.

+0

Ahh, ich habe mich gequatscht. Dieser Regex101 ist ein raffiniertes Werkzeug. Php und Powershell ähneln sich in der Art, wie sie mit Regex umgehen? Danke, Matt – Benny

Verwandte Themen