【发布时间】: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