![将 C# 正则表达式转换为 PowerShell](https://linux22.com/image/1498478/%E5%B0%86%20C%23%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%BD%AC%E6%8D%A2%E4%B8%BA%20PowerShell.png)
我们的软件部门有一个程序可以从某个文件夹运行 SQL 脚本。我现在需要在 PowerShell 中复制此功能。
C#:
var commands = Regex.Split(sqlFileText, @"^\s*GO\s*$", RegexOptions.IgnoreCase | RegexOptions.Multiline);
我在 PowerShell 中尝试了以下操作:
$regex = [regex]'(?im)^\s*GO\s*$'
$commands = $regex.Split($sqlfiletext)
据我对 Regex 的理解,这应该将 SQL 查询拆分为由单词 GO 分隔的命令,但输出却$commands
是一个似乎完全相同的字符串。
示例文本:
SET ANSI_PADDING OFF
END
GO
USE [DB]
SET NOCOUNT ON
GO
IF NOT EXISTS(SELECT * FROM dbo.Table)
[[[stuff]]]
GO
IF EXISTS
编辑:好的,这显然与我创建的方式有关$regex
- 如果我使用以下内容创建它,它可以工作,但是我没有得到不区分大小写的选项:
$regex = new-object System.Text.RegularExpressions.Regex ('^\s*GO\s*$', [System.Text.RegularExpressions.RegexOptions]::MultiLine)
答案1
以下是创建 C# 构造函数调用 1:1 端口的两种可能方法:
$regex = new-object regex('^\s*GO\s*$', ([System.Text.RegularExpressions.RegexOptions]::MultiLine -bor [System.Text.RegularExpressions.RegexOptions]::IgnoreCase))
-bor
与 C# 中的相同|
。额外的括号是必要的,以免混淆重载解析机制。
为了更好的可读性,您还可以利用内置调用Enum.Parse
:
$regex = new-object regex('^\s*GO\s*$', [System.Text.RegularExpressions.RegexOptions] "MultiLine, IgnoreCase")
我也无法让内联选项工作,看来它们在 .NET 构造函数中不受支持/损坏Regex
。它们在使用静态方法时确实有效,例如Regex.Split
:
[regex]::Split($text, "(?im)^\s*GO\s*$")
经过进一步检查,原始命令对我来说是有效的。我之前尝试时犯了一个错误。这是一个可复制/粘贴的代码片段:
([regex]'(?im)^\s*GO\s*$').Split(@"
SET ANSI_PADDING OFF
END
GO
USE [DB]
SET NOCOUNT ON
GO
IF NOT EXISTS(SELECT * FROM dbo.Table)
[[[stuff]]]
GO
IF EXISTS
"@)
答案2
似乎创建 Regex 对象不支持多个标志或其他东西,因为我从来没有让它以这种方式工作。
我设法用下面的方法将它拆分:
$regex = '(?-im)^\s*GO\s*$'
$commands = $file -split $regex