将C#regex转换为Powershell
我有一个正则表达式,它在C#上运行良好: 我曾尝试在Powershell上使用它(或类似版本),但它不起作用。 有人能帮我吗 一些失败的尝试:将C#regex转换为Powershell,c#,regex,powershell,escaping,C#,Regex,Powershell,Escaping,我有一个正则表达式,它在C#上运行良好: 我曾尝试在Powershell上使用它(或类似版本),但它不起作用。 有人能帮我吗 一些失败的尝试: $query = [regex]::Replace($query, "\s*use\s+(.*?)([`r]{0,1}`n)", ("USE [" + $database + "]"), [System.Text.RegularExpressions.RegexOptions]::IgnoreCase -bor [System.Text.RegularE
$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…)USE
行(并且我可以使用类似这样的东西来替换它:$2USE NewDb$2
)
当在Powershell中使用这个(使用相同的正则表达式)时,它不起作用(我仍然会打印USE test
):
$database=“NewDb”
$query=获取内容“”
$query=[regex]::Replace($query,'\s*使用\s+(.*)([`r]{0,1}`n)”,(('use[“+$database+”]),[System.Text.RegularExpressions.RegexOptions]::IgnoreCase-bor[System.Text.RegularExpressions.RegexOptions]::多行)
$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
$database=“NewDb”
$query=(获取内容“”)-join“`r`n”
$query=[regex]::Replace($query,^\s*使用\s+(.*)$,(“`nUSE[“+$database+”]`n”),[System.Text.RegularExpressions.RegexOptions]::IgnoreCase-bor[System.Text.RegularExpressions.RegexOptions]::多行)
$query
但是,换行符仍然不能像.NET版本那样工作。如果单引号引用正则表达式,它能工作吗?在Powershell中,最佳做法是使用单引号字符串文本,并且只有在明确需要可扩展字符串时才使用双引号 编辑: 好的,首先您需要意识到Get Content将返回一个字符串数组(每行一个),而不是一个多行字符串-Replace仍然可以在数组上工作,但是您不想在换行符上匹配,因为没有任何换行符
$query_data = @'
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
'@
$query_data | set-content ./query.txt
$database = "NewDb"
$query = Get-Content ./query.txt
$query = $query -replace '^\s*use\s+(.+)',"USE $database"
$query
产生:
CREATE LOGIN [test] WITH PASSWORD=N'j-9sfjhpsojhp',
DEFAULT_DATABASE=[test], DEFAULT_LANGUAGE=[us_english],
CHECK_EXPIRATION=OFF, CHECK_POLICY=ON
GO
USE NewDb
GO
/****** Object: User [test] Script Date: 10/07/2011 16:39:48 ******/
GO
CREATE USER [test] FOR LOGIN [test] WITH DEFAULT_SCHEMA=[dbo]
GO
您可以将代码缩减为:
$database = "NewDb"
$query = (Get-Content '<path to sql file>') -replace '^\s*use\s+(.+)',"USE $database"
$database=“NewDb”
$query=(获取内容“”)-替换“^\s*使用\s+(.+)”,“使用$database”
不!现在,我尝试了使用Powershell转义的单引号,然后使用C#转义,但仍然不起作用。您能否发布它所针对的数据示例、您得到的结果以及您预期的结果?谢谢!通过合并文件行并稍微修改正则表达式,我使其正常工作(我在上面发布了最终代码)。但是,我想知道为什么它在转义字符方面有问题,例如\r\n
(即使我将行与-join“\r\n”
——用引号而不是斜杠合并,它仍然不能使用这些字符)。在Powershell中,Return和newline将作为“r
n”转义(backtick是转义)。在正则表达式中是“\r”和“\n”,因此您需要加入“r
n”,然后在正则表达式中匹配“\r\n”。谢谢。这就把事情弄清楚了!我应该想到这一点(我在正则表达式中使用了backtick而不是backslax):)
$query_data = @'
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
'@
$query_data | set-content ./query.txt
$database = "NewDb"
$query = Get-Content ./query.txt
$query = $query -replace '^\s*use\s+(.+)',"USE $database"
$query
CREATE LOGIN [test] WITH PASSWORD=N'j-9sfjhpsojhp',
DEFAULT_DATABASE=[test], DEFAULT_LANGUAGE=[us_english],
CHECK_EXPIRATION=OFF, CHECK_POLICY=ON
GO
USE NewDb
GO
/****** Object: User [test] Script Date: 10/07/2011 16:39:48 ******/
GO
CREATE USER [test] FOR LOGIN [test] WITH DEFAULT_SCHEMA=[dbo]
GO
$database = "NewDb"
$query = (Get-Content '<path to sql file>') -replace '^\s*use\s+(.+)',"USE $database"