2017-03-01 140 views

回答

5

你可以使用一個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

+0

這是功能等效的:「 」(= \\ S')(<= \\ S')「'? – nrussell

+1

不,負向變換不等於正向變換,因爲正向變換需要模式的存在。通常,在字符串位置的開始/結束處可以看到差異。 '(?<= \ S)'在下一個子模式之前需要一個非空白字符,因此在字符串的開始處不會有匹配。 '(?<!\ s)'表示之前不能有空格,但字符串的開頭可以在那裏。 –

+0

哇,感謝您的快速回復和完美的答案! – tsutsume

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") 
相關問題