【问题标题】:Regex - Split String on Comma, Skip Anything Between Balanced Parentheses正则表达式 - 用逗号分割字符串,跳过平衡括号之间的任何内容
【发布时间】:2019-03-30 07:46:32
【问题描述】:

需要在 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)

使用上述正则表达式代码,蔓越莓干 未正确拆分。请参考此处的输出截图:Regex Code Output

这里的任何帮助将不胜感激..谢谢!

【问题讨论】:

  • 请不要发布代码/数据/错误的图像,只发布文本本身。几个原因是直接的:我无法将图像中的代码或数据复制到我的 R 控制台并尝试一下,并且我选择不手动转录它。一些原因不太明显但仍然很重要,包括:它会破坏屏幕阅读器hard;搜索引擎不阅读它们,因此搜索不会找到它;移动设备的屏幕尺寸可能是一个限制因素。参考:meta.stackoverflow.com/a/285557/3358272
  • 一旦你进入嵌套匹配括号,我建议你进入正则表达式的标记。

标签: r regex pcre regex-group


【解决方案1】:

this question 的已接受答案的编辑似乎可以完成这项工作。我只是在开头添加了[[: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)" 

【讨论】:

    【解决方案2】:

    你可以使用

    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)" 
    

    查看regex demoonline R demo

    详情

    • (\\((?:[^()]++|(?1))*\\)) - 一个捕获组 #1,它捕获
      • \\( - 一个 ( 字符
      • (?:[^()]++|(?1))* - 除了()[^()]++)或(|)整个组 1 模式(递归以匹配所有嵌套级别)之外,出现 0 次或多次 1+ 字符李>
      • \\) - 一个 ) 字符
    • (*SKIP)(*F) - 这两个动词使引擎跳过当前匹配的字符串并继续在该文本之后立即查找下一个匹配项。
    • | - 或
    • , - 逗号。

    【讨论】:

    • 正是我想要的。该解释有助于我在必要时进行任何修改。接受你的回答,干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2015-11-04
    • 2013-05-19
    • 2018-11-22
    • 2018-04-04
    • 1970-01-01
    相关资源
    最近更新 更多