当前位置: 首页 > 知识库问答 >
问题:

正则表达式在逗号上拆分,但不在任何括号内,并考虑递归

养鸿运
2023-03-14

我有一个字符串示例:

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

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

大多数其他在这里提出类似问题的例子之所以不起作用,是因为递归,向前(或向后)看偶数个括号是不起作用的。

我考虑过将其存储为JSON,但是值的对象类型会在没有通知的情况下发生变化,这在过去甚至json.net都被证明是混乱的,特别是因为类型可能都通过继承来关联。

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

我还没有代码,因为我还在头脑Storm这个方法。

还要注意,子列表不一定是父列表中的最后一个元素,正如我最后的例子中几个挥之不去的value所展示的那样。

请不要在没有充分阅读问题并理解为什么它与这样的问题不同的情况下将其标记为重复

共有1个答案

范俊逸
2023-03-14

尽管C#正则表达式有一个功能,可以让您匹配递归括号中的组(参见下面的Q

此外,在希望递归应用同一个正则表达式的情况下,构建简单的递归下降解析器有一个优势。

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

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));
}

演示。

 类似资料:
  • 我有一根绳子 我想用逗号分隔,但需要排除括号和引号内的逗号(单引号和双引号)。 这样地

  • 问题内容: 我的文字如下: 谁能告诉我我必须使用哪些正则表达式分度数才能获得以下结果: 我在这里阅读Sun教程,直到“ Matcher类的方法”为止,但我仍然茫然。谢谢! 如果是这样,那将很容易,但是不幸的是,事实并非如此。有任何想法吗? 问题答案: 您可以直接使用split()方法,如下所示: (请注意,这将返回长度为5的数组,第一个位置为空字符串) 或者,如果您想使用模式/匹配器,可以这样做:

  • 问题内容: 我有一个目标字符串,如下所示: 而且我要: 通过 仅在括号外 分割目标。与括号外的逗号匹配的正则表达式是什么?就我而言,嵌套括号不会出现,我也不必考虑它们。 我个人使用Python,但是任何语言示例都可以。 问题答案: 您可以使用它进行拆分。请参见demo。这适用于您所说的没有嵌套的情况。 https://regex101.com/r/wV5bD0/1

  • 我需要通过不在括号中的管道拆分文本。这是示例文本 我在这里找到了这个/\ |(?![^{]*})/g:regex,提取字符串,不要在两个括号之间 现在当我想用管子分割这部分字符串时 它还选择杰森、玛丽亚和圣诞老人之间的管道,因为它们后面有一个开口支架。如果正则表达式不在任何括号中,如何将其更改为仅匹配管道。 测试字符串: 应该返回 . 应该返回

  • 问题内容: 我有一个类似于以下内容的字符串: 我想创建一个与逗号匹配的正则表达式,但只匹配不在括号内的逗号(在上面的示例中,除23和45之后的两个逗号之外,所有其他逗号)。我将如何做(如果使用Java正则表达式会有所不同)? 问题答案: 假定没有嵌套的括号(否则,你不能使用Java Regex来完成此任务,因为不支持递归匹配): 此正则表达式使用否定的超前断言来确保下一个括号(如果有)不是闭合括号

  • 问题内容: 在我的一个项目中,我不得不处理逗号分隔文件(CSV)。我必须基于逗号来拆分数据,而忽略引号内的逗号(即),因此我使用了另一个堆栈溢出问题(Java:拆分逗号分隔的字符串但忽略了引号中的逗号)中提到的表达式。一切工作都很好,直到最近我才注意到它不适用于下面提到的一种特定情况。 我需要在逗号上拆分的数据字符串为: 以我的理解为基础 拆分后的数据应返回一个大小为10的数组,该数组的后两个索引