2013-04-29 2 views
5

Я хочу разбить строку на несколько подстрок в тех положениях, где происходит одно или несколько пробелов (табуляция, пробел, ...). In the documentation of strsplit() говорится, что раскол интерпретируется как регулярное выражение.Разделить строку на подстроки на одном или нескольких пробелах

Таким образом, я попытался следующие, которые не работали:

test = "123 nnn  dddddd" 
strsplit(test, "[:space:]+") 

это только возвращаемый:

[[1]] 
[1] "123 nnn  dddddd" 

но должен вернуться:

[[1]] 
[1] "123" "nnn" "dddddd" 

Что неправильно в моем коде?

+1

Попробуйте это вместо: 'strsplit (test," [] + ")' –

+0

собственно 'strsplit (test," + ")' работает также. – plannapus

ответ

9

Попробуйте

strsplit(test, '\\s+') 
[[1]] 
[1] "123" "nnn" "dddddd" 

\\s будет соответствовать все пробельные символы.

+0

Хотелось бы, чтобы я поставил свой комментарий в качестве ответа сейчас! :) –

7

[:space:] должен быть помещен внутри класса символов [], чтобы он работал, то есть [[:space:]]. [:space:] сам по себе будет интерпретироваться как класс символов, состоящий из :, s, p, a, c, e.

strsplit(test, "[[:space:]]+") 

Обратите внимание, что по умолчанию strsplit будет использовать POSIX ERE, что приводит к локаль-зависимого интерпретации [:space:].

В PCRE (Perl-совместимые регулярные выражения), [:space:] является локаль-независимым и эквивалентна \p{Xps}. Таким образом, вы можете включить флаг perl, если хотите согласованное поведение в разных локалях.

Если вы хотите, чтобы свернуть все пробела (ASCII 32) и хотят, чтобы оставить горизонтальные вкладки \t и символы новой строки в одиночку \n, или вы можете предположить, что текст содержит только пространство (ASCII 32) в качестве расстояния символа:

strsplit(test, " +") 
+0

отличный пример ясного ответа –

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