2014-10-03 128 views
-1

正則表達式專家的一個小問題。我有三組不同的charachters我想分開,也許你們可以幫我一點。PowerShell正則表達式過濾

$Dash = '-', '-*','*-','L-','-L' # always a dash sign with or without something else 
$Blank = '', $null, ' ','*',' *', '* ', ' ' # no letter, no dash, but possible asterix 
$Char = 'L', 'F','R*','*C',' C','C ' # always a letter that can be either L, F, C or R with or without asterix or space 

我開始喜歡這一點,因爲我不是一個正則表達式的專家,但它不工作了這麼WEL併成爲過於複雜:

$array | foreach { 
      if ($_ -match '-') {Write-Host "Dash : $_" -ForegroundColor Cyan} 
      elseif (($_ -eq '') -or ($_ -eq $null) -or ($_ -eq ' ') -or ($_ -like ‘`* ’)) {Write-Host "Blank : $_" -ForegroundColor Yellow} 
      else {Write-Host "Perm : $_" -ForegroundColor Magenta} 

     } 

謝謝您的幫助。

+2

試着用更多的細節來描述你以後是什麼樣的模式。一些關於有效和無效比賽的例子也不錯。 – vonPryz 2014-10-03 11:37:32

+0

有效的選項是'$ Dash','$ Blank'和'$ Char'中定義的選項。一切都應該失敗的正則表達式。所以總共需要3個不同的正則表達式來分隔結果。我希望這更清楚。 – DarkLite1 2014-10-03 12:14:35

回答

1

總是帶有或不帶有其他

-(?:\S*)|(?:\S*)- 

東西沒有字母,沒有衝刺,而是可能阿斯特里克斯

[^a-zA-Z-]*\*? 

總是一個字母一個破折號標誌,可以是L,F,C或R帶或不帶星號或空間

[LFCR][\* ]?|[\* ]?[LFCR] 
+0

謝謝瓦利德,正是我正在尋找:)是否也有一個選項,這個正則表達式' - (?:\ S *)|(?:\ S *) - ''除'$ null'和'空格(s)'去?所以我可以替換這個'($ _ -match' - (?:\ S *)|(?:\ S *) - ') - 或($ _ -eq $ null) - 或者($ _ -eq'' )' – DarkLite1 2014-10-06 07:18:45

+0

我想我找到了,用這個:' - (?:\ S *)|(?:\ S *) - | \ s |^$'' – DarkLite1 2014-10-06 07:38:04

1

我會用一個開關命令(我總是建議這個時候有一個以上If語句的二進制結果......換句話說,如果你需要ElseIf,我會建議使用Switch)。

Switch($array){ 
    {$_ -match "-"}{Write-Host "Dash : $_" -ForegroundColor Cyan} 
    {[string]::IsNullOrWhitespace($_) -or $_ -match "^\s*?\*+\s*?$"}{Write-Host "Blank : $_" -ForegroundColor Yellow} 
    {$_ -match "(?:\s|\*)?[lfrc](?:\s|\*)?"}{Write-Host "Perm : $_" -ForegroundColor Magenta} 
} 
+0

你說得對,'Switch'是一個更好的方法。感謝您的幫助 :) – DarkLite1 2014-10-06 07:19:32