【发布时间】:2021-09-19 02:00:55
【问题描述】:
我正在尝试使用正则表达式匹配所有逗号(后跟一个空格):, 在任何括号或方括号之外,即逗号不应包含在括号或方括号中。
目标字符串是A, An(hi, world[hello, (hi , world) world]); This, These。在这种情况下,它应该匹配第一个逗号和最后一个逗号(A 和 An、this 和 these 之间的逗号)。
所以我可以将A, An(hi, world[hello, (hi , world) world]); This, These 拆分为A、An(hi, world[hello, (hi , world) world]); This 和These,而不会导致括号/括号不平衡。
为此,单独使用正则表达式似乎很困难。有没有其他方法可以解决这个问题?
我正在使用的正则表达式:
, (?![^()\[\]]*[\)\]])
但是这个表达式会匹配另外两个不应该匹配的逗号, (第二个和第三个)。
虽然如果它与以下字符串匹配,它将匹配正确的逗号(分别为第一个):A, An(hi, world) 和 A, An[hi, world]
但是如果括号和方括号相互包含,那就有问题了。
此链接中的更多详细信息: https://regex101.com/r/g8DOh6/1
【问题讨论】:
-
必须单独使用正则表达式吗?使用
Text::Balanced(例如)可以提取平衡的括号/括号和其余部分,然后从“其余部分”中选择逗号。 -
@zdim 我已经更新了帖子。不一定是单独的正则表达式。任何事情都可以解决问题。
-
好的,谢谢!所以......你想要最终的结果是什么? those_commas 之前的单词(没有逗号)?请查看我的答案并告诉我(我会编辑更多)——它解决了问题,但我不知道实际的_result 应该是什么!
-
目的是将目标字符串与外面的逗号分开,假设目标字符串为
B, C, hello(D,) world,预期输出为BChello(D,) world -
所以我可以继续最后一步:将
hello(D,) world变成hello world。不过,这篇文章不是关于这最后一步。更多的是为最后一步做准备。