C#匹配字符串中的递归结构
我目前正在加载一个文本文件,通过搜索找到一个特定的结构,然后用不同的文本替换该结构的某个部分的程序。C#匹配字符串中的递归结构
我需要找到和提取为"N"(N)
,其中N是任意字符的结构。例如。可以说我有这样一个文本文件:
大家都知道这句话“不要做超过你能做的事情”(吉姆多)。 那么,我在这里告诉你,这句话很棒。这是 另一个,“天空是蓝色的,太阳是明亮的”(萨莉希尔莫尔)。
我希望能够匹配文本"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)
。例如:
“随机报价”(随便的人)这是一个有趣的说法,“天空是蓝色和 的阳光灿烂,甚至有人说‘真明丽’(其他)”(莎莉 Wantsmore )。
这存在许多问题。只有一场比赛,因为它需要第一个“,然后找到最后一个”,然后找到(Sally Wantsmore)的一组parens并且只找到匹配。然而,我希望它能够找到所有的比赛,尤其是分开的开始,最后一个,甚至内部的引用。这是正则表达式可能吗?如果没有,我该如何解决这个递归c#代码。
下面的正则表达式应该找到你要找的两件事情:
\"([\w ]+)\" \(([\w ]+)\)
在C#中,你可以使用Regex.Match检索括号中的两项。
供参考。你可以在这里测试它:http://regexr.com/3d92i – stackErr
谢谢。雅这似乎是工作! – ktconrad90
你怎么可能有它在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}");
}
这些是组的名称。不知道其他正则表达式的风格。这是一个.NET的东西 –
很酷,我会试试视觉工作室。这对于以这种方式工作会很好。 – ktconrad90
所以你要找到一个引号的字符串后面括号中的作者的名字吗? – stackErr
为什么你不能使用正则表达式呢? – Tenner
\“([\ w] +)\”(([\ w] +)\)效果不错,但是如何添加标点符号检查?例如,它不会因为逗号而发现“不要,做得比你能做的更多”(吉姆多伊)。 – ktconrad90