我正在尝试识别日志文件中的错误。该应用程序使用五个大写字母,后跟三个数字,后跟“ 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个字符),但是为什么它仍然与非错误的小写字母模式匹配?
答案 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