我试图使用正则表达式将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]
答案 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].*)?)*"