【问题标题】:How to match a pattern with Regex in C#, for the regex challenged?对于正则表达式的挑战,如何在 C# 中将模式与正则表达式匹配?
【发布时间】:2023-03-22 13:28:01
【问题描述】:

以下面的字符串示例为例,我应该使用什么模式来提取我需要的所有字符串实例?所以,采取:

string Text = @"Dear {Customer.Name},
              Lorem ipsum dolor sit amet, {Customer.FirstName}";

然后提取{Customer.Name}{Customer.FirstName}?作为奖励可以在提取过程中删除{} 吗?

我正在使用 LinqPad,到目前为止我已经得到了 new Regex("{[A-Za-z0-9.]+}", RegexOptions.Multiline).Match(Text),但它只匹配 {Customer.Name} 的第一个子字符串。

我在正则表达式方面遇到了很大的挑战,所以我很感激详细的帮助。

提前致谢!

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    您的正则表达式看起来不错。唯一的问题是,您需要调用 Matches 而不是 Match 来获取输入字符串中的所有匹配项。

    您可以将您想要的部分作为结果放入一个子组中,然后仅在进一步处理中使用该子组:

    var matches = Regex.Matches(Text, "{([A-Za-z0-9.]+)}", RegexOptions.Multiline);
    foreach(Match match in matches)
    {
        var variable = match.Groups[1].Value;
    }
    

    【讨论】:

    • 另外,使用静态Regex.Matches 方法会更好,因为它会缓存正则表达式,而不是每次都创建一个新的。 (您可以只传递 Regex 对象,但这很烦人。)
    • 大声笑,Matches 部分是你打自己耳光并想你怎么可能错过的事情之一?我想它只是显示了我对正则表达式的未受教育程度......无论如何,谢谢你的例子,我在 LinqPad 中尝试过,它产生了我需要的东西。再次感谢!
    • 是的,我只是在评论后忘记接受它。 :p
    【解决方案2】:

    一个解决方案向前看向后看,不需要使用组..

    (?<={)[^}]*(?=})
    

    【讨论】:

    • 当然很有趣,但是从代码维护的角度来看很糟糕。
    • +1 @Gursel,就维护而言,我不知道它有多矫枉过正或有多糟糕,但我喜欢它。我现在要使用我的模式只是因为我理解它,但是当我学会阅读你的模式时,我可能会使用它。不过感谢您的示例!
    • 但要小心,这些结构是性能杀手,如果您的文本大小约为 mb 大小,我不推荐此解决方案。
    • 我认为它更多的是在 KB 范围内。想想一个有几页的文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    相关资源
    最近更新 更多