我目前正在开发一个加载文本文件的程序,搜索它以查找特定的结构,然后用不同的文本替换该结构的某个部分。
我需要查找和提取的结构是"N"(N)
,其中N是任何字符。例如。假设我有一个这样的文本文件:
每个人都知道这句话"做得比你能做的更多" (吉姆·多伊) 好吧,我在这里告诉你,这句话太棒了。这是 另一个,"天空是蓝色的,太阳是明亮的" (Sally Wantsmore)。
我希望能够将文字"Do not do more than you can do" (Jim Doe)
与"The sky is blue and the sun is bright" (Sally Wantsmore)
匹配。
我不认为根据我所知,有一种方法可以用正则表达式来做到这一点。我过去几天一直在努力。我不能让它工作,它本质上是一种递归模式。我的问题是,我将如何编写C#代码来解析并找到这些模式。我想做一些能找到字符串中的位置和长度的东西,这样我就可以从字符串中提取它。
EDIT 我需要能够捕获引用中的所有字符。这意味着报价中还可能有另一组引号,甚至还有另一组括号。这意味着该结构本身也可以包含匹配。
我现在正在尝试使用此表达式,因为我需要能够捕获引号中的所有字符:\"(.+)\" \(([\w ]+)\)
下面列出的答案都有效。但是,我发现了一个限制。这有一个可能的递归结构。我目前遇到的问题是"N"(N)
内有"N"(N)"
。例如:
"随机引用" (随机的人)这是一个有趣的说法,"天空是蓝色的 太阳很明亮,有些人甚至说'#34;非常明亮" (其他)" (莎莉 Wantsmore)。
这提出了许多问题。只有一个匹配,因为它需要第一个",然后找到最后一个"就在(其他人)之后,为(Sally Wantsmore)找到了一组parens并且只发现匹配。但是,我希望它找到所有的比赛,特别是开头的一个和最后一个可分,甚至内部引用。正则表达式可以实现吗?如果没有,我如何使用递归c#代码来解决这个问题。
答案 0 :(得分:3)
以下正则表达式应该找到您正在寻找的两件事:
\"([\w ]+)\" \(([\w ]+)\)
在C#中,您可以使用Regex.Match检索括号中的两个项目。
答案 1 :(得分: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}");
}