以非白色 space 为界的逗号正则表达式匹配

Regular expression matching on comma bounded by nonwhite space

我正在尝试用白色 space 替换由非白色 space 包围的逗号,同时保持其他逗号不变(在 R 中)。

假设我有:

j<-"Abc,Abc, and c"

我想要:

"Abc Abc, and c"

这几乎可以工作:

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

但是它删除了逗号两边的字符,给出:

"Ab bc, and c"

您可以像这样使用反向引用:

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

正则表达式中的()捕获逗号附近的字符。 \1\2 return 这些捕获的值按照它们被捕获的顺序排列。

我们可以试试

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

您可以使用带有负向后视和前视的 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

也许它也有效:

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