新線

2016-04-06 47 views
1

取代所有其他的空間,我有一個字符串是這樣的:新線

a <- "this string has an even number of words" 
b <- "this string doesn't have an even number of words" 

我想更換新線所有其他空間。所以輸出應該是這樣的......

myfunc(a) 
# "this string\nhas an\neven number\nof words" 
myfunc(b) 
# "this string\ndoesn't have\nan even\nnumber of\nwords" 

我已經做了strsplitpaste -ing於偶數的話換行回到一起完成這一點,那麼他們paste(a, collapse=" ")成一個字符串。是否有與gsub一起使用的正則表達式,可以實現這一點?

回答

4

@Jota提出了一個簡潔明瞭的方式:

myfunc = function(x) gsub("(\\S+) ", "\\1\n", x)  # Jota's  
myfunc2 = function(x) gsub("([^ ]+ [^ ]+) ", "\\1\n", x) # my idea 

lapply(list(a,b), myfunc) 


[[1]] 
[1] "this string\nhas an\neven number\nof words" 

[[2]] 
[1] "this string\ndoesn't have\nan even\nnumber of\nwords" 

它是如何工作。"([^ ]+ [^ ]+) "正則表達式的思想是:(1)「找到兩個單詞/非空格序列,它們之間有一個空格,之後有空格」和(2)「用換行符替換尾部空格」。

@ Jota的"(\\S+) "更棘手 - 它找到任何帶有前後空格的單詞,然後用換行符替換尾部空格。這是有效的,因爲由此捕獲的第一個單詞是該字符串的第二個單詞;而下一個單詞不是第三個單詞(因爲我們在處理第二個單詞時已經「消費」了/看第三個單詞前的空格),而是第四個單詞;等等。

哦,還有一些基本的正則表達式的東西。

  • [^xyz]表示除字符x,y和z之外的任何單個字符。
  • \\s是一個空間,同時\\S是什麼,但一個空間
  • x+裝置x一次或多次
  • (x) 「捕獲」 x,從而允許更換參考,就像\\1
+0

嘿你介意解釋一下正則表達式,以便下次得到它嗎?謝謝! – cory