【问题标题】: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,我也能应付得来。在输出中

标签: c# regex


【解决方案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,它给出了错误,现在我只是投票给了答案,再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多