如何创建使用正则表达式替换文本中的字符串的PowerShell脚本

Tol*_*ayi 2 regex powershell escaping

我有一个像这样的字符串:

"Item 1","Item 2"

我想使用powershell脚本替换它,使它看起来像这样:

Item 1{tab character}Item 2

我有这个:

$text = '"Item 1","Item 2"'
$expr1 = '"([^"]+?)","([^"]+?)"'
$expr2 = "$1\t$2"
$line = [System.Text.RegularExpressions.Regex]::Replace($text, $expr1, $expr2);
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

顺便说一句,对于如何处理Powershell中的转义引号和特殊字符,是否有明确的参考?我发现它确实令人困惑.

.

.

编辑:

我想这样做的原因是我可以将它包装在参数化脚本中并使用参数调用它.脚本(regex-rs.ps1)是这样的:

param
(
    [string] $text,
    [string] $inputPattern,
    [string] $replacePattern
)

function Main()
{
    $text2 = [System.Text.RegularExpressions.Regex]::Replace($text, $inputPattern, $replacePattern);
    [System.Console]::WriteLine($text2);
}

Main;
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我这样调用脚本时:

powershell .\regex-rs.ps1 '"Text1","Text2"' '`"([^`"]+?)`",`"([^`"]+?)`"' '`$1`t`$2'
Run Code Online (Sandbox Code Playgroud)

它输出:

Text1,Text2
Run Code Online (Sandbox Code Playgroud)

换句话说,没有标签.我究竟做错了什么?

.

.

进一步编辑以响应NICK的答案:(我必须把它放在这里,因为StackOverflow中的注释格式与反引号混淆)

我在powershell调用中用双引号替换了单引号,如下所示:

powershell .\regex-rs.ps1 ""Text1","Text2"" "`"([^`"]+?)`",`"([^`"]+?)`"" "`$1`t`$2"
Run Code Online (Sandbox Code Playgroud)

但我得到了这个错误:

Missing ] at end of type token.
Run Code Online (Sandbox Code Playgroud)

还有什么想法?

.

最终编辑:这是对修复问题的脚本的调用(必须作为图像发布,因为它非常强大以至于它违反了StackOverflow的格式,即使在这里):.

最后的脚本调用

Nic*_*ick 7

你做错了是在'单引号字符串'中使用转义字符(`).单引号字符串被视为文字.您需要使用"双引号"才能正常工作:

$text = '"Item 1","Item 2"'
$expr1 = '"([^"]+?)","([^"]+?)"'
$expr2 = "`$1`t`$2"
$line = [System.Text.RegularExpressions.Regex]::Replace($line, $expr1, $expr2);
Run Code Online (Sandbox Code Playgroud)

- 编辑 -

我只用$ expr2中的双引号替换单引号.您遇到问题是因为您在$ text和$ expr1中用双引号替换了单引号,但没有转义字符串中的引号字符.

$ text可以使用这样的单引号:

$text = '"Text1","Text2"'
Run Code Online (Sandbox Code Playgroud)

或者像这样的双引号(转义"字符串内部"):

$text = "`"Text1`",`"Text2`""
Run Code Online (Sandbox Code Playgroud)

$ expr1可以使用这样的单引号:

$expr1 = '"([^"]+?)","([^"]+?)"'
Run Code Online (Sandbox Code Playgroud)

或双引号如下:

$expr1 = "`"([^`"]+?)`",`"([^`"]+?)`""
Run Code Online (Sandbox Code Playgroud)

并且$ expr2应该只使用这样的双引号:

$expr2 = "`$1`t`$2"
Run Code Online (Sandbox Code Playgroud)

- 再次编辑 -

我现在对你的问题实际上并不乐观.我知道我最初发布的4行是在PowerShell中工作的.我从我的答案中复制了它们并将它们粘贴在一个PowerShell控制台中,它起作用了.将字符串作为参数传递给我不知道的脚本,我无法在我现在的位置测试它.但试试我添加的内容,看看会发生什么.

- 编辑3 -

这有效,但我不知道为什么^必须在第二次重复.如果我只有1 ^它没有出现在字符串中所以它不匹配,但如果我加倍它就完美了.不知道为什么^需要在一个地方加倍而在另一个地方不加倍.

powershell .\regex.ps1 '\"Test1\",\"Test2\"' '\"([^"]+?)\",\"([^^\"]+?)\"' "`$1`t`$2"
Run Code Online (Sandbox Code Playgroud)

在powershell中,如果要使用转义字符,则必须使用双引号字符串并使用反引号(`)来转义它们.在第一个和第二个字符串的命令行中,我必须使用单引号并使用反斜杠(\)来转义"字符.出于某种原因,在第二个参数中,第二个^需要重复两次才能实际出现在字符串中.我不知道为什么.对于第三个参数,我必须再次使用反引号,以便字符串在传入powershell脚本时正常工作.

我责怪微软处理高度不一致的字符串.


Sha*_*evy 5

PowerShell中的转义字符是Backtick(`,与〜相同的键),以扩展它需要用引号括起来:

PS> $text -replace '","',"""`t"""
Run Code Online (Sandbox Code Playgroud)

你也可以逃避报价:

PS> $text -replace '","',"`"`t`""
Run Code Online (Sandbox Code Playgroud)

在控制台中输入以获取更多帮助:

PS> Get-Help about_Escape_Characters
Run Code Online (Sandbox Code Playgroud)