【问题标题】:C# Matching a recursive structure in a stringC#匹配字符串中的递归结构
【发布时间】:2023-03-12 12:57:01
【问题描述】:

我目前正在开发一个程序,它加载一个文本文件,搜索它以找到一个特定的结构,然后用不同的文本替换该结构的某个部分。

我需要查找和提取的结构是"N"(N),其中 N 是任意字符。例如。假设我有一个这样的文本文件:

每个人都知道“不要做超出你所能做的事情”(Jim Doe)这句话。 好吧,我在这里告诉你,这句话很棒。这是 另一个,“天空是蓝色的,太阳是明亮的”(Sally Wantsmore)。

我希望能够将文本 "Do not do more than you can do" (Jim Doe)"The sky is blue and the sun is bright" (Sally Wantsmore) 匹配。

据我所知,我认为真的没有办法用正则表达式来做到这一点。最近几天我一直在努力。我无法让它工作,它本质上是一种递归模式。我的问题是,我将如何编写 C# 代码来解析并找到这些模式。我想做一些可以找到字符串中的位置和长度的事情,这样我就可以从字符串中提取它。

编辑 我需要能够捕获引号中的所有字符。这意味着引号中还可能有另一组引号,甚至还有另一组括号。这意味着结构本身也可以包含匹配项。

我现在正在尝试使用这个表达式,因为我需要能够捕获引号中的所有字符:\"(.+)\" \(([\w ]+)\)

下面列出的答案都有效。但是,我发现了一个限制。这有一个可能的递归结构。我目前遇到的问题是"N"(N)" 内部有一个"N"(N)。例如:

“随机引用”(随机人)这里有句有趣的说法,“天空是蓝色的, 太阳很亮,有些人甚至说“真的很亮”(其他人)”(莎莉 想要更多)。

这会带来很多问题。只有一个匹配,因为它需要第一个 ",然后在 (others) 之后找到最后一个 ",并找到 (Sally Wantsmore) 的一组括号,并且只找到那个匹配。但是,我希望它能够找到所有匹配项,尤其是开头和最后一个分开的匹配项,甚至是内部引用。正则表达式可以做到这一点吗?如果没有,我该如何使用递归 c# 代码解决这个问题。

【问题讨论】:

  • 所以你想找到一个带引号的字符串,后跟括号中的作者姓名?
  • 为什么不能使用正则表达式?
  • \"([\w ]+)\" (([\w ]+)) 效果很好,但是如何添加标点符号检查?例如,由于逗号,它不会找到“Do not, do more than you can do”(Jim Doe)。

标签: c# string parsing recursion text-extraction


【解决方案1】:

以下正则表达式应该找到您要查找的两件事:

\"([\w ]+)\" \(([\w ]+)\)

在 C# 中,您可以使用 Regex.Match 检索括号中的两项。

【讨论】:

    【解决方案2】:

    关于如何在 C# 中使用它的示例:

    var quotes = Regex.Matches(@"Everyone knows the saying ""Do not do more than you can do"" (Jim Doe). Well, I'm here to tell you that this saying is awesome. Here is another, ""The sky is blue and the sun is bright"" (Sally Wantsmore).", 
        "(?<Quotes>\"(?<Text>[\\w ]+)\\\" \\((?<Author>[\\w ]+)\\))", RegexOptions.Singleline);
    
    foreach (Match quote in quotes)
    {
        var text = quote.Groups["Text"].Value;
        var author = quote.Groups["Author"].Value;
        Console.WriteLine($"Text: {text}, Author: {author}");
    }
    

    【讨论】:

    • 标记是正则表达式语法还是仅此 c# 正则表达式。当我在 regexr.com 上运行 "(?\"(?[\\w ]+)\\\" \((?[\\w ]+)\))" 时,它似乎没有找到任何匹配项。
    • 这些是组的名称。不知道其他正则表达式风格。这是一个 .NET 的东西
    • 酷,我会在visual studio中试一试。如果它以这种方式工作,那就太好了。
    • 你只需在控制台程序中运行它。它就像一个美女一样工作。
    • 太棒了!如果您找到解决问题的答案。考虑将其标记为已接受:meta.stackexchange.com/questions/5234/…
    猜你喜欢
    • 2017-10-28
    • 2015-11-04
    • 2014-01-01
    • 2017-10-08
    • 2011-02-28
    • 2016-04-12
    • 1970-01-01
    • 2017-04-24
    • 2013-08-04
    相关资源
    最近更新 更多