将 C# 正则表达式转换为 PowerShell

将 C# 正则表达式转换为 PowerShell

我们的软件部门有一个程序可以从某个文件夹运行 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

相关内容