PowerShell正则表达式的意外结果

时间:2018-07-09 09:24:54

标签: regex powershell

我正在尝试识别日志文件中的错误。该应用程序使用五个大写字母,后跟三个数字,后跟“ E”作为错误代码。错误代码后跟非单词字符。我正在通过以下方式确定案例:

$errors=Select-string -Path "logfile.txt" -Pattern "[A-Z]{5}[0-9]{3}E\W"

但是其余内容现在包括

ab1bea8a-a00e-4211-b1db-2facecfd725e.

正则表达式匹配哪个并标记为错误。我将正则表达式更改为

\p{Lu}{5}[0-9]{3}E\W

(我的expected to match five upper case个字符),但是为什么它仍然与非错误的小写字母模式匹配?

2 个答案:

答案 0 :(得分:4)

“ {不区分大小写”正则表达式标志由Select-String设置,与\p{Lu}一样,它使[A-Z]不区分大小写。

尝试将-CaseSensitive参数添加到命令中。

您可以通过运行某些.NET代码(例如在LINQPad中)来确认这一点:

(new Regex(@"\p{Lu}", RegexOptions.IgnoreCase)).IsMatch("a")

答案 1 :(得分:2)

PowerShell正则表达式匹配默认情况下不区分大小写。不过,有几种方法可以区分大小写。

  • 使用Select-String cmdlet时添加-CaseSensitive开关:

      

    -CaseSensitive

         

    使匹配项区分大小写。 默认情况下,匹配不区分大小写。

    C:\> 'abc' | Select-String -Pattern 'A'
    
    abc
    
    C:\> 'ABC' | Select-String -Pattern 'A'
    
    ABC
    
    C:\> 'abc' | Select-String -Pattern 'A' -CaseSensitive    # ← no match here
    C:\> 'ABC' | Select-String -Pattern 'A' -CaseSensitive
    
    ABC
    
  • 使用正则表达式matching operators的区分大小写的版本:

      

    默认情况下,所有比较运算符都不区分大小写。 要使比较运算符区分大小写,请在运算符名称前加上c。例如,-eq的区分大小写的版本是-ceq。要明确区分大小写,请在运算符前面加上i。例如,-eq的不区分大小写的版本是-ieq

    C:\> 'abc' -match 'A'
    True
    C:\> 'ABC' -match 'A'
    True
    C:\> 'abc' -cmatch 'A'    # ← no match here
    False
    C:\> 'ABC' -cmatch 'A'
    True
    
  • 通过添加miscellaneous construct(?...)(不要与非捕获组(?:...)混淆)来强制区分大小写的匹配,并且倒置的“不区分大小写” regex option到正则表达式(这与Select-String cmdlet和-match运算符一起使用):

    C:\> 'abc' | Select-String -Pattern '(?-i)A'    # ← no match here
    C:\> 'ABC' | Select-String -Pattern '(?-i)A'
    
    ABC
    
    C:\> 'abc' -match '(?-i)A'    # ← no match here
    False
    C:\> 'ABC' -match '(?-i)A'
    True