【发布时间】:2014-04-29 07:10:30
【问题描述】:
我正在尝试使用正则表达式将 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]
【问题讨论】:
-
请显示您的代码,而不仅仅是正则表达式。
-
已添加代码。我的术语也有点松散,我实际上并没有得到一组组,而是一组捕获。我已更新问题以反映这一点。
-
尝试添加
RegexOptions.Multiline(msdn.microsoft.com/en-us/library/…)) -
你有会使用正则表达式吗?我问是因为如果您有一个部分包含一个带有
name=[123]的条目怎么办?这不会在你的系统中扔一个扳手吗?您是否考虑过使用处理 ini 文件的 Win32 API 而不是自己实现? -
Lasse,得到的结果和以前一样。
标签: .net regex powershell ini