Фильтрация PowerShell Regex

Небольшой вопрос для экспертов по регулярному выражению. У меня есть 3 разных группы чахатчиков, которые я хотел бы разделить, может быть, вы, ребята, можете мне немного помочь.

$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

Я начал так, потому что я не эксперт по регулярному выражению, но он не работает так хорошо и становится слишком сложным:

$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 ответа

всегда знак тире с или без чего-то еще

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

нет буквы, нет тире, но возможно астерикс

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

Всегда письмо, которое может быть L, F, C или R с или без звездочки или пространства

[LFCR][\* ]?|[\* ]?[LFCR]


Я бы использовал команду Switch (я всегда рекомендую это, когда есть более чем двоичный результат из оператора 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}
}

licensed under cc by-sa 3.0 with attribution.