用新线替换所有其他空间

时间:2016-04-06 15:38:22

标签: regex r gsub

我有这样的字符串:

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 - 换行来完成此操作,然后paste(a, collapse=" ")将它们组合成一个字符串。是否有与gsub一起使用的正则表达式可以实现此目的?

1 个答案:

答案 0 :(得分:5)

@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