我想从包含在变量中的字符串值开始,选择文件路径的部分字符串。让我在一个抽象的示例中对此进行解释。
让我们假设以下路径:/ docs / reports / test report / document1.docx
使用正则表达式,我可以这样获取所需的字符串:
'^.*(?=\/test\s)'
https://regex101.com/r/6mBhLX/5
结果字符串为“ / test report / document1.docx”。
现在,要使其正常工作,我必须使用文字字符串“ test”。但是,我想知道如何使用包含'test'的变量,例如$ myString。
我已经看过如何在正则表达式中使用变量?但我不知道如何将其适应PowerShell。
谢谢!
我建议$([regex]::escape($myString))在双引号中使用字符串文字:
$myString="[test]"
$pattern = "^.*(?=/$([regex]::escape($myString))\s)"
或者,如果您不想担心其他转义,请使用+运算符使用常规串联:
$pattern = '^.*(?=/' + [regex]::escape($myString) +'\s)'
结果$pattern将看起来像^.*(?=/\[test]\s)。由于$myString变量是文字字符串,因此您需要转义所有[regex]::escape()可能位于其中的特殊正则表达式元字符(带有),以便正则表达式引擎将其解释为文字字符。
就您而言,您可以使用
$s = '/docs/reports/test reports/document1.docx'
$myString="test"
$pattern = "^.*(?=/$([regex]::escape($myString))\s)"
$s -replace $pattern
结果: /test reports/document1.docx
\n
Wiktor Stribi\xc5\xbcew\ 的有用答案提供了关键的指导:
\n用于[regex]::Escape()转义字符串以安全包含在正则表达式(正则表达式)中,以便将其视为文字;
\ne.g.,[regex]::Escape(\'$10?\')产生\\$10\\?- 对正则表达式具有特殊含义的字符是\\转义。
但是,我建议使用\'...\',即从单引号(又名逐字字符串)构建正则表达式:
$myString=\'test\'\n$regex = \'^.*(?=/\' + [regex]::escape($myString) + \'\\s)\'\n使用-f运算符 -$regex = \'^.*(?=/{0}\'\\s)\' -f [regex]::Escape($myString)也可以工作,并且可能在视觉上更清晰,但请注意-f- 与字符串连接不同+- 是文化敏感的,这可能会导致不同的结果。
在 PowerShell 的正则表达式上下文中使用\'...\'字符串是一个好习惯:
通过避免"..."所谓的可扩展字符串,您可以避免对字符串进行额外的预先解释(插值又名扩展),这可能会产生意想不到的效果,因为它在两种上下文$中都有特殊含义:\na变量引用或子表达式的开头字符串扩展以及正则表达式中的输入结束标记。
在基于正则表达式的运算符的替换操作数中使用"..."可能特别棘手,其中诸如引用捕获组结果之类的标记,如果您使用,PowerShell 将尝试扩展PowerShell 变量,该变量可能不存在,从而导致在空字符串中。-replace$1"$1"$1 
-replace,请参阅此答案。| 归档时间: | 
 | 
| 查看次数: | 3515 次 | 
| 最近记录: |