用正则表达式匹配非空格界定的逗号

5
我将尝试在不影响其他逗号的情况下,将非空格边界的逗号替换为一个空格(在R中)。
假设我有以下内容:
j<-"Abc,Abc, and c"

and I want:

"Abc Abc, and c"

这几乎可以工作:
gsub("[^ ],[^ ]"," " ,j)

但是它会删除逗号两侧的字符,结果如下:
"Ab bc, and c"
4个回答

5
您可以使用带有负回溯和前瞻的PCRE正则表达式:

您可以使用带有负回溯和前瞻的PCRE正则表达式:

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

请参见正则表达式演示 细节:
  • (?<!\\s) - 逗号前面不能有空格
  • , - 逗号本身
  • (?!\\s) - 逗号后面不能有空格
另一种解决方案是匹配带有单词边界的逗号:
j <- "Abc,Abc, and c"
gsub("\\b,\\b", " ", j)
## => [1] "Abc Abc, and c"

请查看另一个R演示


这个函数是否等同于 "(?<=\\S),(?=\\S)" - nrussell
1
不,负向前瞻与正向前瞻并不等同,因为正向前瞻要求模式存在。通常,在字符串的起始/结束位置上可以看到差异。"(?<=\S)"表示在下一个子模式之前需要非空白字符,因此,在字符串开头将没有匹配。“(?<!\s)”意味着之前不能有空格,但是字符串开头可以有空格。 - Wiktor Stribiżew

3

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

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

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


3
我们可以尝试。
gsub(",(?=[^ ])", " ", j, perl = TRUE)
#[1] "Abc Abc, and c"

0

也许它也能工作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接