【问题标题】:Separate strings with semicolon and delimiter and containing parentheses用分号和分隔符分隔字符串并包含括号
【发布时间】:2012-09-28 14:16:28
【问题描述】:

我需要用分号 (;) 作为分隔符来分隔字符串。括号内的分号应该被忽略。

例子:

string inputString = "(Apple;Mango);(Tiger;Horse);Ant;Frog;";

字符串的输出列表应该是:

(Apple;Mango)
(Tiger;Horse)
Ant
Frog

其他有效的输入字符串可以是:

string inputString = "The fruits are (mango;apple), and they are good"

上面的字符串应该拆分成一个字符串

"The fruits are (mango;apple), and they are good"

string inputString = "The animals in (African (Lion;Elephant) and Asian(Panda; Tiger)) are endangered species; Some plants are endangered too."

上面的字符串应该分成两个字符串,如下所示:

"The animals in (African (Lion;Elephant) and Asian(Panda; Tiger)) are endangered species"
"Some plants are endangered too."

我搜索了很多,但找不到上述场景的答案。

有人知道如何在不重新发明轮子的情况下实现这一目标吗?

【问题讨论】:

  • 感谢您的及时回复。能举个例子吗?
  • 是否有理由使用分号作为分隔符?你的结构非常接近JSON,那么为什么不直接使用它呢?没有什么反对正则表达式,因为那也行,我只是一个标准的支持者。
  • Here 是一些正则表达式示例。
  • @iMortalitySX:这就是我获取输入字符串的方式,我无权更改它。
  • @user1571734 明白了,但要明确一点,是否有任何情况下您会在另一个括号对象中包含括号对象?例如“(苹果;(芒果;梨));(老虎;马);蚂蚁;青蛙;”

标签: c# regex parsing


【解决方案1】:

使用与您要保留的内容匹配的正则表达式,而不是分隔符:

string inputString = "(Apple;Mango);(Tiger;Horse);Ant;Frog;";

MatchCollection m = Regex.Matches(inputString, @"\([^;)]*(;[^;)]*)*\)|[^;]+");

foreach (Match x in m){
  Console.WriteLine(x.Value);
}

输出:

(Apple;Mango)
(Tiger;Horse)
Ant
Frog

表达式 cmets:

\(           opening parenthesis
[^;)]*       characters before semicolon
(;[^;)]*)*   optional semicolon and characters after it
\)           closing parenthesis
|            or
[^;]+        text with no semicolon

注意:上面的表达式也接受不带分号的括号中的值,例如(Lark) 和多个分号,例如(Lark;Pine;Birch)。它还将跳过空值,例如";;Pine;;;;Birch;;;" 将是两个项目,而不是十个。

【讨论】:

  • 谢谢!会试一试。
  • 上面的正则表达式将文本“The fruits are (mango;apple), and they are good”拆分为两个字符串。实际上,它应该是一个。
  • @user1571734:我明白了,改变了规格。 ;) 在括号前后添加条件集,并重复括号和其后的集合:@"[^;]*\(([^;)]*(;[^;)]*)*\)[^;]*)+|[^;]+"
  • @Guffa,您知道您的正则表达式完全等同于更简单的([^;]|[(][^)]*[)])*,对吧?虽然这也不会做更新的规范,但是:正则表达式不能计数,所以嵌套括号是不可能的。 (请注意,正则表达式中有很多不规则扩展,我真的不知道什么是可能的,什么是不可能的。但是嵌套括号通常表明您需要一个真正的解析器。)
【解决方案2】:

将带括号的情况与“正常”情况分开处理,以确保在前者中省略分号。

实现此目的的正则表达式(匹配输入中的单个元素)可能如下所示(未经测试):

"\([A-Za-z;]+\)|[A-Za-z]+"

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多