c# - 考虑到递归,正则表达式以逗号分隔但不在任何括号内

标签 c# regex

我有一个示例字符串:

string myString = "value,value,(value,(value, value, value, (value), value),value)";

目标是遍历它并将其反序列化为类对象的层次结构。

这里提出类似问题的大多数其他示例都不起作用的原因是递归,向前(或向后)查找偶数个括号将不起作用。

我考虑过将其存储为 JSON,但值的对象类型会有所不同,恕不另行通知,事实证明,这在过去甚至混淆了 json.net,尤其是因为类型可能都通过继承相关。

因此,给定示例字符串,目标是按逗号“,”拆分,但忽略括号中的所有内容,直到我的递归循环挖掘该子集然后使用相同的正则表达式拆分其内容。

我还没有代码,因为我还在集思广益这个方法。

另请注意,子列表不一定是父列表中的最后一个元素,正如我最后的示例中的一对挥之不去的 value 所示。

不要标记为重复没有完整阅读问题并理解为什么它与 this 之类的问题不同。

最佳答案

虽然 C# 正则表达式有一个功能可以让你递归地匹配带括号的组(参见 this Q&A for an example),但为正例(即“匹配一个词或整个带括号的组”)定义这样的正则表达式比负例更容易拆分所需的大小写(即“匹配逗号除非它在括号内”)。

此外,在您想递归地应用相同的正则表达式的情况下,构建一个简单的 Recursive Descent Parser 有一个优势。

解析器的核心是拆分逻辑,它在搜索逗号时对括号进行计数,并在括号级别为零时进行拆分:

var parts = new List<string>();
var parenLevel = 0;
var lastPos = 0;
for (var i = 0 ; i != s.Length ; i++) {
    switch (s[i]) {
        case '(':
            parenLevel++;
            break;
        case ')':
            parenLevel--;
            if (parenLevel < 0) {
                throw new ArgumentException();
            }
            break;
        case ',':
            if (parenLevel == 0) {
                parts.Add(s.Substring(lastPos, i-lastPos));
                lastPos = i + 1;
            }
            break;
    }
}
if (lastPos != s.Length) {
    parts.Add(s.Substring(lastPos, s.Length - lastPos));
}

Demo.

关于c# - 考虑到递归,正则表达式以逗号分隔但不在任何括号内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35131631/

相关文章:

jquery - 变量作为字段名jquery验证规则

c# - 恰好 N 个元素的正则表达式,不多不少

c# - WPF应用程序是用什么语言开发的

c# - 错误激活 int 没有匹配的绑定(bind)是 av

javascript - 匹配一组字符串的任意组合

javascript - 使用 javascript/Jquery 获取方括号内的字符串

python - 如何在python中匹配$(....)中的字符串

当 anchor 离开轴 View 时,C# 图表线注释消失

c# - 使用 C# 将值写入注册表

c# - 为什么 WPF 设计器无法加载调用非托管 DLL 的库?