【问题标题】:Regex for replacing commas only within square brackets仅在方括号内替换逗号的正则表达式
【发布时间】:2019-11-08 17:28:51
【问题描述】:

我有一个文本文件,它包含逗号分隔的字符串。但是一些用逗号分隔的字符串是[*,*,*,...] 的形式。比如:

“你好”、“再见”、[“是”、“否”、“也许]、“确实”、[“为什么”、“什么”]

我希望能够解析文件以仅用分号替换方括号内的逗号。括号内可以有任意数量的括号和任意数量的逗号。

我尝试在 R 中使用此代码,但它没有按计划工作,括号外的一些逗号正在被替换:

repeat{
          tmp <- gsub("(\\[.*\\K),(?=.*\\])", ";", tmp, perl = TRUE) # replace last comma found within braces with semicolon
          if (sum(grepl("(\\[.*\\K),(?=.*\\])", tmp, perl = TRUE)) == 0) {  # repeat until no more commas found
            break
          }
        }

谁能帮助解决这个问题的正则表达式?谢谢!

【问题讨论】:

  • 这是一个字符串吗

标签: r regex pcre


【解决方案1】:

要将方括号内的所有逗号替换为分号,您可以使用

gsub("(?:\\G(?!^)|\\[)[^][,]*\\K,", ";", x, perl=TRUE)

请参阅regex demo。上面的正则表达式不检查关闭]。如果需要,请使用

gsub("(?:\\G(?!^)|\\[)[^][,]*\\K,(?=[^][]*])", ";", x, perl=TRUE)

见another regex demo

详情

  • (?:\G(?!^)|\[) - 上一场比赛结束 (\G(?!^)) 或 (|) [ (\[)
  • [^][,]* - 除了 [ 和 ] 和 ] 之外还有 0+ 个字符
  • \K - 匹配重置运算符,丢弃到目前为止匹配的所有文本
  • , - 逗号
  • (?=[^][]*]) - 一个正向前瞻,需要除 [ 和 ] 之外的 0+ 个字符以及紧邻当前位置右侧的 ]。

【讨论】:

  • 谢谢 - 这非常有效 - 作为快速跟进,我还想知道如果我处理大括号 ({}) 而不是方括号 ([] )
  • @Keith 将每个文字 [ 替换为 { 和 ] 替换为 }, "(?:\\G(?!^)|\\{)[^{},]*\\K,(?=[^{}]*})"
  • @Keith 好吧,() 会有所不同。你需要同时逃脱。
  • 好的,非常感谢!此外,我不认为在原始解决方案中它是直接的替代品 - 在圆括号regex101.com/r/EPHDcU/3 中玩耍并得出了这个答案
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2021-07-01
相关资源
最近更新 更多