由非白色空间限制的逗号上的正则表达式匹配

时间:2017-03-01 12:39:29

标签: r regex regular-language

我正在尝试用非白色空格替换以白色空格为界的逗号,同时保持其他逗号不变(在R中)。

想象一下我有:

j<-"Abc,Abc, and c"

我希望:

"Abc Abc, and c"

这几乎有效:

gsub("[^ ],[^ ]"," " ,j)

但它删除了逗号两边的字符:

"Ab bc, and c"

4 个答案:

答案 0 :(得分:5)

您可以使用具有负面lookbehind和预测的PCRE正则表达式:

j <- "Abc,Abc, and c"
gsub("(?<!\\s),(?!\\s)", " ", j, perl = TRUE)
## => [1] "Abc Abc, and c"

请参阅regex demo

<强>详情:

  • (?<!\\s) - 在,
  • 之前不能有空格
  • , - 文字,
  • (?!\\s) - 在,
  • 之后不能有空格

另一种解决方案是匹配用词边界包围的,

j <- "Abc,Abc, and c"
gsub("\\b,\\b", " ", j)
## => [1] "Abc Abc, and c"

请参阅another R demo

答案 1 :(得分:3)

你可以使用这样的反向引用:

gsub("([^ ]),([^ ])","\\1 \\2" ,j)
[1] "Abc Abc, and c"

正则表达式中的()捕获逗号旁边的字符。 \\1\\2按照捕获的顺序返回这些捕获的值。

答案 2 :(得分:3)

我们可以尝试

gsub(",(?=[^ ])", " ", j, perl = TRUE)
#[1] "Abc Abc, and c"

答案 3 :(得分:0)

也许它也有效:

library("stringr")
j<-"Abc,Abc, and c"
str_replace(j,"(\\w+),([\\w]+)","\\1 \\2")