2016-04-06 4 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" 

Я совершил это, делая strsplit, paste -ную перевод строки на четных слов, то 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" 

Как это работает. Идея "([^ ]+ [^ ]+) " regex is (1) «найти две последовательности слов/нераспространений с пробелом между ними и пробелом после них» и (2) «заменить конечное пространство на новую строку».

@ Jota's "(\\S+) " сложнее - он находит любое слово с пробелом до и после него, а затем заменяет конечное пространство символом новой строки. Это работает, потому что первое слово, которое поймано этим, - это второе слово строки; и следующее слово, пойманное им, не является третьим (поскольку мы уже «потребляем»/смотрим на пространство перед третьим словом при обработке второго слова), а скорее на четвертое; и так далее.

О, и некоторые основные вещи регулярного выражения.

  • [^xyz] означает любой одиночный символ, кроме сов х, у и г.
  • \\s является пространством, в то время как \\S ничего, но пространство
  • x+ означает x один или несколько раз
  • (x) «захватывает» x, что позволяет для справки в замене, как \\1
+0

Эй, не могли бы вы объяснить регулярное выражение, чтобы я получил его в следующий раз? Благодаря! – cory

Смежные вопросы