将C#regex转换为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

我有一个正则表达式,它在C#上运行良好:

我曾尝试在Powershell上使用它(或类似版本),但它不起作用。 有人能帮我吗

一些失败的尝试:

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

  • 由于我的第一次尝试似乎是使用一个.NET函数,这个函数不应该像在.NET上一样工作吗?(因为我认为我看到了一些差异,但我无法找出原因——是因为转义角色吗?)

  • 如何将我的第一个正则表达式(如上所示)转换为Powershell(使用[regex]::Replace()或-ireplace)

  • 更新

    要测试的数据(我使用它来更改SQL脚本中的默认DB):

    使用C#工具,我正确地获得了
    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"