选择INI部分的正则表达式只选择.NET中的部分头

时间:2014-03-21 18:33:59

标签: .net regex powershell ini

我试图使用正则表达式将INI文件的各个部分作为捕获数组返回:

\[[^\]\r\n]+](?:\r?\n(?:[^\[\r\n].*)?)*

这几乎适用于我尝试过的每一个正则表达式检查程序,包括一个使用.NET的程序,但是当我在我的程序中尝试它时,它只选择节标题,而不是正文。

我在Powershell工作,但我明确地使用New-Object创建了一个Regex对象,而不是内置的-match运算符。我有点失落,因为它在我的环境之外工作但不在其中。

更新:Ansgar提醒我,我应该显示我的代码,所以在这里。

$IniRegex = New-Object System.Text.RegularExpressions.Regex("\[[^\]\r\n]+](?:\r?\n(?:[^\[\r\n].*)?)*")
$TestIni = Get-Content "C:\Test.ini"
$SectionsMatches = $IniRegex.Matches($TestIni)

$SectionsMatches.Count
$SectionsMatches[0].Captures[0].ToString()
$SectionsMatches[1].Captures[0].ToString()

Test.ini文件包含一些示例设置:

[Test0]
Setting0=0
Setting1=1

[Test1]
Setting2=2
Setting3=3

代码的输出是:

2
[Test0]
[Test1]

1 个答案:

答案 0 :(得分:2)

如果您使用的是PowerShell 3或更高版本,请将-Raw添加到Get-Content的末尾。默认情况下,Get-Content返回一个字符串数组,其中一个元素对应一行。但是你想要匹配一个字符串:

$IniRegex = New-Object System.Text.RegularExpressions.Regex("\[[^\]\r\n]+](?:\r?\n(?:[^\[\r\n].*)?)*")
$TestIni = Get-Content "C:\Test.ini" -Raw
$SectionsMatches = $IniRegex.Matches($TestIni)

$SectionsMatches.Count
$SectionsMatches[0].Captures[0].ToString()
$SectionsMatches[1].Captures[0].ToString()

如果您使用的是v2,则可以改为:

$TestIni = (Get-Content "C:\Test.ini") -join ''

此外,通过使用[regex]类型加速器,您可以缩短创建正则表达式的行:

$IniRegex = [regex]"\[[^\]\r\n]+](?:\r?\n(?:[^\[\r\n].*)?)*"