gpt4 book ai didi

.net - 用于选择 INI 部分的正则表达式仅选择 .NET 中的部分标题

转载 作者:行者123 更新时间:2023-12-05 01:22:13 24 4
gpt4 key购买 nike

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

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

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

我在 Powershell 中工作,但我使用 New-Object 而不是内置的 -match 运算符显式创建了一个 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 的末尾。默认情况下,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].*)?)*"

关于.net - 用于选择 INI 部分的正则表达式仅选择 .NET 中的部分标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22566867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com