powershell 搜索的字符串中的反引号

问题描述 投票:0回答:1

所以,我有一个包含这个内容的对象

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 被“触发”。 这对我来说毫无意义。 我错过了什么? 或者,更具体地说,我如何验证整个序列是否与第一行一致(所以我也想匹配反引号)?

powershell string-matching
1个回答
0
投票

反引号

`
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
© www.soinside.com 2019 - 2024. All rights reserved.