2014-10-03 127 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