选择INI节的正则表达式仅在.NET中选择节标题

选择INI节的正则表达式仅在.NET中选择节标题,.net,regex,powershell,ini,.net,Regex,Powershell,Ini,我试图使用正则表达式将INI文件的部分作为捕获数组返回: \[[^\]\r\n]+](?:\r?\n(?:[^\[\r\n].*)?)* 这适用于我尝试过的几乎所有正则表达式检查器,包括使用.NET的正则表达式检查器,但当我在程序中尝试时,它只选择节标题,而不选择正文 我在Powershell中工作,但我使用新对象(而不是内置的匹配操作符)显式创建Regex对象。我有点不知所措,因为它在我的环境之外工作,而不是在它里面 更新:Ansgar提醒我应该显示我的代码,所以在这里 $IniRegex

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

\[[^\]\r\n]+](?:\r?\n(?:[^\[\r\n].*)?)*
这适用于我尝试过的几乎所有正则表达式检查器,包括使用.NET的正则表达式检查器,但当我在程序中尝试时,它只选择节标题,而不选择正文

我在Powershell中工作,但我使用新对象(而不是内置的匹配操作符)显式创建Regex对象。我有点不知所措,因为它在我的环境之外工作,而不是在它里面

更新: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]

如果您使用的是PowerShell 3或更高版本,请在获取内容的末尾添加-Raw。默认情况下,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]类型加速器,您可以大大缩短创建regex的行:

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

请显示您的代码,而不仅仅是正则表达式。代码已添加。我的术语也有点松散,我实际上没有得到一个组数组,而是一个捕获数组。我已更新问题以反映这一点。请尝试添加
RegexOptions。多行
())是否必须使用正则表达式?我这样问是因为如果你有一个包含
name=[123]
的条目的部分怎么办?这不会给你的系统带来麻烦吗?您是否考虑过使用Win32 API来处理ini文件,而不是实现您自己的类?得到了与以前相同的结果……回想起来,这似乎是显而易见的。无论如何:赢家,赢家,鸡肉晚餐,非常感谢,晚安。只有在你犯了几次错误之后,这才是显而易见的。:)我发现当传递给需要单个字符串的方法时,
$TestIni
,会用空格替换原来的换行符。在正则表达式中搜索空间实际上是可行的。