【发布时间】:2014-03-08 13:21:58
【问题描述】:
我有这个在 C# 上运行良好的正则表达式:
\s*use\s+(.*?)([\r]{0,1}\n)
我曾尝试在 Powershell 上使用它(或类似版本),但它不起作用。 有人可以帮我吗?
一些失败的尝试:
$query = [regex]::Replace($query, "\s*use\s+(.*?)([`r]{0,1}`n)", ("USE [" + $database + "]"), [System.Text.RegularExpressions.RegexOptions]::IgnoreCase -bor [System.Text.RegularExpressions.RegexOptions]::Multiline)
$query = [regex]::Replace($query, "\s*use\s+([^`r]{1,}?)([`r])", ("USE [" + $database + "]$2"), [System.Text.RegularExpressions.RegexOptions]::IgnoreCase -bor [System.Text.RegularExpressions.RegexOptions]::Multiline)
$query = $query -ireplace "\s*use\s+(.+)([\r]{0,1})", ("USE [" + $database + "]"
一些问题:
我需要使用
`r`n来获取C# 的\r\n吗? (我还不熟悉 PowerShell...)由于我的第一次尝试似乎是使用 .NET 函数,所以该函数不应该像在 .NET 上一样工作吗? (因为我认为我看到了一些差异,但我无法确定原因 - 是因为转义字符吗?)
如何将我的第一个正则表达式(如上所示)翻译成 Powershell(使用 [regex]::Replace() 或 -ireplace)?
更新
要测试的数据(我用它来更改 SQL 脚本中的默认数据库):
CREATE LOGIN [test] WITH PASSWORD=N'j-9sfjhpsojhp',
DEFAULT_DATABASE=[test], DEFAULT_LANGUAGE=[us_english],
CHECK_EXPIRATION=OFF, CHECK_POLICY=ON
GO
USE test
GO
/****** Object: User [test] Script Date: 10/07/2011 16:39:48 ******/
GO
CREATE USER [test] FOR LOGIN [test] WITH DEFAULT_SCHEMA=[dbo]
GO
使用 C# 工具,我得到了正确的 USE 行(我可以使用这样的东西替换它:$2USE NewDb$2)。
在 Powershell 中使用这个(使用相同的正则表达式)时,它不起作用(我仍然得到 USE test 打印):
$database = "NewDb"
$query = Get-Content '<path to sql file>'
$query = [regex]::Replace($query, '\s*use\s+(.*?)([`r]{0,1}`n)', ("USE [" + $database + "]"), [System.Text.RegularExpressions.RegexOptions]::IgnoreCase -bor [System.Text.RegularExpressions.RegexOptions]::Multiline)
$query
更新
一个可行的解决方案:
$database = "NewDb"
$query = (Get-Content '<file path>') -join "`r`n"
$query = [regex]::Replace($query, '^\s*use\s+(.*?)$', ("`nUSE [" + $database + "]`n"), [System.Text.RegularExpressions.RegexOptions]::IgnoreCase -bor [System.Text.RegularExpressions.RegexOptions]::Multiline)
$query
但是,换行符仍然不能像在 .NET 版本中那样工作。
【问题讨论】:
标签: c# regex powershell escaping