【问题标题】:Get different result with the same regex pattern in C# [duplicate]在 C# 中使用相同的正则表达式模式获得不同的结果 [重复]
【发布时间】:2023-03-06 14:50:01
【问题描述】:

我有一个来自 INI 文件的字符串,如下所示。

string inistr = "[sectionA]KeyName_1=10.01\r\nKeyName_2=20.2\r\nKeyName_3=15.6\r\n[sectionB]KeyName_4=10.01\r\nKeyName_5=20.2\r\nKeyName_6=15.6\r\n"

然后我首先尝试通过正则表达式分成 2 个部分,我尝试了这个正则表达式并从here 得到以下结果。

接下来,我开始用C#尝试,用Regex.Matches来实现。

var sections = Regex.Matches(inistr, @"^\[.*\](\r|\n|\r\n)[a-zA-Z0-9_=.\r\n]*");

if(sections.Count != 0)
{
    foreach(var sect in sections)
        Console.WriteLine(sect.ToString());
}
else
    Console.WriteLine("Cannot Find Any Section...");

但是,我发现它无法通过正则表达式模式找到任何部分。

然后我发现如果我不使用'^',模式可以得到部分,如下所示。

//var sections = Regex.Matches(inistr, @"^\[.*\](\r|\n|\r\n)[a-zA-Z0-9_=.\r\n]*");
var sections = Regex.Matches(inistr, @"\[.*\](\r|\n|\r\n)[a-zA-Z0-9_=.\r\n]*");

但我不知道为什么如果我使用 '^' 它不能捕获部分。

为什么 C# 和 here 的结果不同?

【问题讨论】:

  • 您的在线工具使用的是正则表达式的 PHP 变体,这与 C# 变体不同。如果你想测试一个正则表达式,你需要使用一个 .NET 兼容的工具。查看副本。
  • 我试过你的代码,但不管^是否存在,都不匹配。为什么不使用一些ini包来解析呢?

标签: c# .net regex string


【解决方案1】:

使用RegexOptions.Multiline 选项使^ 匹配行首(而不是字符串的开头)。所以你的匹配代码应该是这样的:

var sections = Regex.Matches(
    inistr, @"^\[.*\](\r|\n|\r\n)[a-zA-Z0-9_=.\r\n]*", RegexOptions.Multiline
);

【讨论】:

  • 谢谢!你解决了我的困惑!它像正则表达式中的“/gm”吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2020-04-17
  • 2016-11-04
  • 1970-01-01
  • 2019-08-12
  • 2019-08-28
  • 2018-06-04
相关资源
最近更新 更多