正则表达式拆分和忽略括号

Posted

技术标签:

【中文标题】正则表达式拆分和忽略括号【英文标题】:Regex to split and ignore brackets 【发布时间】:2021-09-22 12:16:24 【问题描述】:

我需要在文本中用逗号分隔,但文本在括号内也有一个逗号,需要忽略

输入文本:Selectroasted 花生、糖(糖、花式糖浆)、氢化植物油(棉籽和菜籽油)、盐。

预期输出:

电烤花生 糖(糖、花式糖浆) 氢化植物油(棉籽油和菜籽油) 盐

我的代码

string pattern = @"\s*(?:""[^""]*""|\([^)]*\)|[^, ]+)";
string input = "Selectroasted peanuts,Sugars (sugar, fancymolasses),Hydrogenatedvegetable oil (cottonseed and rapeseed oil),Salt."; 
foreach (Match m in Regex.Matches(input, pattern)) 
 
Console.WriteLine("0", m.Value); 

我得到的输出:

电烤 花生 糖 (糖,花式糖浆) 氢化蔬菜 油 (棉籽油和菜籽油) 盐

请帮忙。

【问题讨论】:

最后的.Salt 之后会发生什么?如果在输出中得到Salt. 可以吗? 是的,即使我得到了 Salt,我也能应付得来。在输出中 【参考方案1】:

你可以使用

string pattern = @"(?:""[^""]*""|\([^()]*\)|[^,])+";
string input = "Selectroasted peanuts,Sugars (sugar, fancymolasses),Hydrogenatedvegetable oil (cottonseed and rapeseed oil),Salt."; 
foreach (Match m in Regex.Matches(input.TrimEnd(new[] '!', '?', '.', '…'), pattern)) 
 
    Console.WriteLine("0", m.Value); 

// => Selectroasted peanuts
//    Sugars (sugar, fancymolasses)
//    Hydrogenatedvegetable oil (cottonseed and rapeseed oil)
//    Salt

请参阅C# demo。也请参阅regex demo。它匹配一个或多个出现的

"[^"]*" - ",除" 之外的零个或多个字符,然后是" | - 或 \([^()]*\) - 一个(,然后是除() 之外的任何零个或多个字符,然后是) 字符 | - 或 [^,] - , 以外的字符。

请注意,代码 sn-p 中的 .TrimEnd(new[] '!', '?', '.', '…') 部分旨在删除结尾的句子标点符号,但如果您可以在输出中提供 Salt.,则可以删除该部分。

【讨论】:

谢谢,工作就像一个魅力。我花了 4 个小时,得到了所有类型的输出,除了我想要的。干杯! 我早些时候尝试过投票,但由于我的声誉低于 15,它给出了错误,现在我只是投票给了答案,再次感谢。

以上是关于正则表达式拆分和忽略括号的主要内容,如果未能解决你的问题,请参考以下文章

如何忽略正则表达式中的括号[重复]

Java正则表达式用逗号分割字符串,但忽略引号和括号[重复]

正则表达式拆分字符串,提取之前的字符串值和方括号之间的数值

正则表达式模式忽略输入字符串中的内括号

正则表达式用于选择花括号内的双引号而忽略外部的引号

忽略正则表达式搜索中的模式错误,不要使搜索崩溃