Преобразование C# R...
 
Уведомления
Очистить все

Преобразование C# Regex в PowerShell

1 Записи
1 Пользователи
0 Likes
447 Просмотры
134-150 Okolokompa Форум
(@loxedo)
Eminent Member
Присоединился: 4 года назад
Записи: 12
Создатель темы  

В нашем отделе программного обеспечения есть программа, которая запускает сценарии SQL из определенной папки.

Теперь мне нужно скопировать эту функциональность в PowerShell.

C #:

var commands = Regex.Split(sqlFileText, @"^\s*GO\s*$", RegexOptions.IgnoreCase | RegexOptio

Я пробовал следующее в 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)

РЕШЕНИЕ:

Вот два возможных способа вызова конструктора C#:

$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")

После дальнейшего изучения вопроса, теперь так у меня. Я сделал ошибку в попытке раньше. Вот фрагмент, готовый для копирования / вставки:

([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
"@)

Дополнительно:

Кажется, что создание объекта Regex не поддерживает несколько флагов или что-то в этом роде, потому что я никогда не работал так.

Мне удалось разделить его на следующее:

$regex = '(?-im)^\s*GO\s*$'
$commands = $file -split $regex

   
Цитата
Поделиться: