正则表达式仅在方括号内替换逗号

时间:2019-06-26 17:39:28

标签: r regex pcre

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

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

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

我尝试在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
          }
        }

任何人都可以使用正则表达式来解决此问题吗?谢谢!

1 个答案:

答案 0 :(得分:4)

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

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

请参见regex demo。上面的正则表达式不会检查结束]。如果需要,请使用

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

请参见another regex demo

详细信息

  • (?:\G(?!^)|\[)-上一场比赛(\G(?!^)或(|)a [\[)的结尾
  • [^][,]*-除[]]以外的0个字符
  • \K-匹配重置运算符,该运算符将舍弃到目前为止已匹配的所有文本
  • ,-逗号
  • (?=[^][]*])-一个正向超前查询,除了[]之外,还需要0个以上的字符,并且紧接当前位置右侧的]