所以,我有一个包含这个内容的对象
some text
some more text
INSERT INTO `myTable` VALUES
some text
some more text
我想选择“INSERT INTO ...”这一行。注意反引号。 当我循环浏览这一行的内容时,我确实看到了其中的内容:[T][O][ ][`][m][y] ...
现在,当检查以下模式时:
$pattern1 = "INSERT INTO *"
$pattern2 = "INSERT INTO `*"
$pattern3 = "INSERT INTO ``*"
$pattern4 = "INSERT INTO `m*"
$pattern5 = 'INSERT INTO `*'
$pattern6 = 'INSERT INTO `r*'
$content | ForEach-Object {
if ($_ -like $pattern1) {
Write-Output "line '$_' corresponds with pattern"
}
if ($_ -like $pattern2) {
Write-Output "line '$_' corresponds with pattern"
}
if ($_ -like $pattern3) {
Write-Output "line '$_' corresponds with pattern"
}
if ($_ -like $pattern4) {
Write-Output "line '$_' corresponds with pattern"
}
if ($_ -like $pattern5) {
Write-Output "line '$_' corresponds with pattern"
}
if ($_ -like $pattern6) {
Write-Output "line '$_' corresponds with pattern"
}
}
我注意到右行只有模式 1 和模式 2 被“触发”。 这对我来说毫无意义。 我错过了什么? 或者,更具体地说,我如何验证整个序列是否与第一行一致(所以我也想匹配反引号)?
反引号
`
是WildcardPattern
类的通配符转义字符。如果你想匹配文字反引号,同样需要转义:
'INSERT INTO `myTable` VALUES' -like 'INSERT INTO `m*' # False
'INSERT INTO `myTable` VALUES' -like 'INSERT INTO ``m*' # True
注意上面示例中使用的单引号,这样反引号就不会在字符串中展开。
以下也应该是一个选项:
'INSERT INTO `myTable` VALUES' -like "$([WildcardPattern]::Escape('INSERT INTO `m'))*"
但是,有一个关于
WildcardPattern.Escape
没有正确转义单独的反引号的未决问题,请考虑对其进行投票,以便我们可以在较新版本的 PowerShell 中修复此问题。请参见GitHub 问题 #16306。
对于这种特殊情况,您可以改用正则表达式匹配:
'INSERT INTO `myTable` VALUES' -match 'INSERT INTO `m.*' # True