【问题标题】:Regex to select INI sections is only selecting section headers in .NET选择 INI 部分的正则表达式仅在 .NET 中选择部分标题
【发布时间】: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


【解决方案1】:

如果您使用的是 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].*)?)*"

【讨论】:

  • ...回想起来,这似乎很明显。无论如何:胜利者,胜利者,鸡肉晚餐,非常感谢,晚安。
  • 只有在你已经犯了几次错误之后才明显。 :)
  • 我发现$TestIni 在传递给需要单个字符串的方法时,会用空格替换原来的换行符。在正则表达式中搜索空格确实有效。
猜你喜欢
  • 2018-11-29
  • 2019-02-20
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 2017-03-08
  • 2021-12-28
相关资源
最近更新 更多