C # Regex'i PowerShell'e Dönüştürme


1

Yazılım departmanımızın SQL scriptlerini belirli bir klasörden çalıştıran bir programı vardır. Şimdi bu işlevi PowerShell'de çoğaltmam gerekiyor.

C #:

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

PowerShell'de aşağıdakileri denedim:

$regex = [regex]'(?im)^\s*GO\s*$'
$commands = $regex.Split($sqlfiletext)

Regex’ten anladığım kadarıyla, bu, SQL sorgusunu GO kelimesiyle ayrılmış komutlara bölmeli, ancak çıktısı $commandstamamen aynı görünen tek bir dizedir.

Örnek metin:

SET ANSI_PADDING OFF
END
GO


USE [DB]
SET NOCOUNT ON
GO

IF NOT EXISTS(SELECT * FROM dbo.Table)
    [[[stuff]]]
GO

IF EXISTS

EDIT: Tamam, bu açıkça benim yarattığım iş ile ilgili bir şey $regex- eğer çalışırsa aşağıdaki şekilde yaratırsam, ancak büyük / küçük harf duyarsız seçeneği alamıyorum:

$regex = new-object System.Text.RegularExpressions.Regex ('^\s*GO\s*$', [System.Text.RegularExpressions.RegexOptions]::MultiLine)

-bor(Bitwise OR) operatörünü kullanmanın nesi yanlış ? Tabii IgnoreCasebelirtmedikçe davranışını alamazsın.
Daniel B

Hakkında fazla bir şey bilmiyorum -borama sayıların bir şey olduğunu düşünmüştüm, sicimin bölünmesi değil. Ve New-Object komutuna iki RegEx seçeneği eklemenin bir yolunu bulamıyorum. Lütfen bunu başarmanın iki yolu olarak da aydınlatın.
Deadly-Bagel

Bu site[regex]'(?im)... bit hakkında açıklıyor ama işe görünmüyor.
Ölümcül Bagel

Yanıtlar:


3

İşte C # yapıcı çağrısının 1: 1 bağlantı noktasını oluşturmanın iki olası yolu:

$regex = new-object regex('^\s*GO\s*$', ([System.Text.RegularExpressions.RegexOptions]::MultiLine -bor [System.Text.RegularExpressions.RegexOptions]::IgnoreCase))

-bor|C # ile aynıdır . Ekstra parantezler, aşırı yük çözünürlük mekanizmasını karıştırmamak için gereklidir.

Daha iyi okunabilirlik için, yerleşik aramaya aşağıdakilerden de yararlanabilirsiniz Enum.Parse:

$regex = new-object regex('^\s*GO\s*$', [System.Text.RegularExpressions.RegexOptions] "MultiLine, IgnoreCase")

Çalışmak için satır içi seçenekleri alamadım, .NET Regexyapıcısında desteklenmiyor / kırılmamış gibi görünüyor . Aşağıdakiler gibi statik yöntemler kullanırken çalışırlar Regex.Split:

[regex]::Split($text, "(?im)^\s*GO\s*$")

Daha fazla inceleme üzerine, orijinal komut benim için çalışıyor. Daha önce denerken bir hata yaptım. İşte bir kopya / yapıştırmaya hazır pasajı:

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

Ahhhh, demek istediğin buydu -bor, hiç böyle bir belge kullanmadım. Thanks =)
Deadly-Bagel

Ne ... ve asıl girişim şimdi çalışıyor ... Feh, boşver. Kapsamlı cevabı takdir edin
Deadly-Bagel

1

Bir Regex nesnesi oluşturmak, birden çok bayrağı veya bir şeyi desteklemiyor gibi görünüyor, çünkü onu asla bu şekilde çalıştırmadım.

Bunun yerine aşağıdaki ile bölme başardı:

$regex = '(?-im)^\s*GO\s*$'
$commands = $file -split $regex
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.