正则表达式-按逗号拆分字符串,跳过平衡括号中的内容

3
需要在R-Perl中编写一个正则表达式,它可以将字符串按逗号“,”拆分,但跳过圆括号内的所有逗号。挑战是确保括号平衡,即关闭括号映射回其开放括号。
在下面的正则表达式代码中,除了注意到括号不平衡外,一切都运行完美,内部结束括号被视为外部开始括号。
text <- "PEANUTS (PEANUTS, PEANUT OIL AND/OR COTTONSEED OIL AND/OR CANOLA OIL AND/OR SOYBEAN OIL, SALT), GOLDEN RAISINS (RAISINS, SULFUR DIOXIDE), DRIED CRANBERRIES (CRANBERRIES, SUGAR, CITRIC ACID, SUNFLOWER OIL (PROCESSING AID), ELDERBERRY JUICE CONCENTRATE (COLOR)), ALMONDS (ALMONDS, PEANUT OIL AND/OR COTTONSEED OIL AND/OR CANOLA OIL AND/OR SOYBEAN OIL, SALT), MACADAMIAS (MACADAMIAS, MALTODEXTRIN, SALT)"

strsplit(text, '\\([^*)^)]*\\)(*SKIP)(*F)|\\,', perl=T)

使用上面的正则表达式代码,干蔓越莓没有被正确拆分。请参考此处的输出屏幕截图: 正则表达式代码输出 任何帮助都将不胜感激..谢谢!

请勿发布代码/数据/错误的图像,只需发布文本即可。其中一些原因立即显而易见:我无法从您的图像中复制代码或数据到我的 R 控制台并尝试它,我选择不手动转录它。还有一些原因虽然稍微不那么明显,但仍然很重要,包括:它会使屏幕阅读器难以识别;搜索引擎不会读取它们,因此搜索将无法找到它;移动设备的屏幕尺寸可能是一个限制因素。参考:https://meta.stackoverflow.com/a/285557/3358272 - r2evans
一旦你进入嵌套匹配括号的领域,我建议你使用标记化而不是正则表达式。 - r2evans
2个回答

1

你可以使用

strsplit(text, "(\\((?:[^()]++|(?1))*\\))(*SKIP)(*F)|,", perl=TRUE)
# => [[1]]
[1] "PEANUTS (PEANUTS, PEANUT OIL AND/OR COTTONSEED OIL AND/OR CANOLA OIL AND/OR SOYBEAN OIL, SALT)"                            
[2] " GOLDEN RAISINS (RAISINS, SULFUR DIOXIDE)"                                                                                 
[3] " DRIED CRANBERRIES (CRANBERRIES, SUGAR, CITRIC ACID, SUNFLOWER OIL (PROCESSING AID), ELDERBERRY JUICE CONCENTRATE (COLOR))"
[4] " ALMONDS (ALMONDS, PEANUT OIL AND/OR COTTONSEED OIL AND/OR CANOLA OIL AND/OR SOYBEAN OIL, SALT)"                           
[5] " MACADAMIAS (MACADAMIAS, MALTODEXTRIN, SALT)" 

请查看正则表达式演示在线R演示

详细信息

  • (\\((?:[^()]++|(?1))*\\)) - 捕获组#1捕获
    • \\( - 一个(字符
    • (?:[^()]++|(?1))* - 0或多个不是()(使用[^()]++)的1个或多个字符,或者(|)整个组1模式(递归匹配所有嵌套级别)
    • \\) - 一个)字符
  • (*SKIP)(*F) - 这两个动词使引擎跳过当前匹配的字符串,并立即继续寻找下一个匹配项。
  • | - 或
  • , - 逗号。

1
正是我所需要的。这个解释对我来说很有帮助,如果需要的话可以进行任何修改。接受了你的答案,干杯! - Mohit Gulla

0

对于这个问题的已接受答案的编辑似乎可以完成任务。我只是在开头添加了[[:alpha:][:space:]]*

pat <- '[[:alpha:][:space:]]*\\(((?>[^()]+)|(?R))*\\)'
regmatches(text, gregexpr(pat, text, perl = TRUE))
#[[1]]
#[1] "PEANUTS (PEANUTS, PEANUT OIL AND/OR COTTONSEED OIL AND/OR #CANOLA OIL AND/OR SOYBEAN OIL, SALT)"                            
#[2] " GOLDEN RAISINS (RAISINS, SULFUR DIOXIDE)"                                                                                 
#[3] " DRIED CRANBERRIES (CRANBERRIES, SUGAR, CITRIC ACID, SUNFLOWER #OIL (PROCESSING AID), ELDERBERRY JUICE CONCENTRATE (COLOR))"
#[4] " ALMONDS (ALMONDS, PEANUT OIL AND/OR COTTONSEED OIL AND/OR #CANOLA OIL AND/OR SOYBEAN OIL, SALT)"                           
#[5] " MACADAMIAS (MACADAMIAS, MALTODEXTRIN, SALT)" 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接