在PowerShell中带有嵌入式双引号的正则表达式模式

时间:2018-08-05 13:25:32

标签: powershell escaping quoting

需要使用PowerShell在文档上搜索以下关键字:

["Allowed Acquisition Clean-Up Period" 
$keyword = ""
Get-Content $SourceFileName | Select-String -Pattern $keyword

我要搜索的字符串中有双引号,因此我在如何在此$keyword中进行提及感到困惑。

2 个答案:

答案 0 :(得分:3)

显然,您不仅有双引号,而且还有一个方括号。方括号是正则表达式中的元字符(用于定义字符类),因此您也需要转义这些字符。

用单引号定义表达式:

$keyword = '\["Allowed Acquisition Clean-Up Period"'

或使用反引号对嵌套的双引号进行转义:

$keyword = "\[`"Allowed Acquisition Clean-Up Period`""

答案 1 :(得分:2)

补语 Ansgar Wiechers' helpful answer,其中包含正确的解决方案:

鉴于"不是正则表达式元字符(在正则表达式中没有特殊含义),您的问题可以归结为:
如何在PowerShell的字符串中嵌入"(双引号)?

  • 顺便说一句:如上所述,[ 是regex元字符,因此必须将其\[转义为正则表达式内的字符才能被视为文字。正如TheIncorrigible1所指出的那样,您可以让[regex]::Escape($string)为您处理这些逃逸的事件;结果在正则表达式的上下文中按字面意义处理$string的内容。

这里有几个选项,以简化的示例字符串3 " of rain进行了演示-另请参见:Get-Help about_Quoting_Rules

# Inside a *literal string* ('...'):
# The content of single-quoted strings is treated *literally*.
# Double quotes can be embedded as-is.
'3 " of rain'

# Inside an *expandable string* ("..."):
# Such double-quoted strings are subject to *expansion* (interpolation)
# of embedded variable references ("$var") and expressions ("$(Get-Date)")
# Use `" inside double quotes; ` is PowerShell's escape character.
"3 `" of rain"                                                                                 #"
# Inside "...", "" works too.
"3 "" of rain"

# Inside a *literal here-string* (multiline; end delimiter MUST be 
# at the very beginning of a line):
# " can be embedded as-is.
@'
3 " of rain
'@

# Inside an *expanding here-string*:
# " can be embedded as-is, too.
@"
3 " of rain
"@

出于完整性考虑:您可以通过其Unicode代码点创建双引号(标识每个字符的数字),即0x22(十六进制)/ {{1 }}(十进制),将其强制转换为34,例如: [char]
您可以使用:

  • 字符串串联中的内容:[char] 0x22
  • 使用'3 ' + [char] 0x22 + ' of rain'运算符在字符串格式表达式中-f