Удалите конечные и ведущие пробелы и дополнительные внутренние пробелы с одним вызовом gsub
Я знаю, что вы можете удалить конечные и ведущие пробелы с помощью
gsub("^\\s+|\\s+$", "", x)
И вы можете удалить внутренние пробелы с помощью
gsub("\\s+"," ",x)
Я могу объединить их в одну функцию, но мне было интересно, есть ли способ сделать это одним использованием функции gsub
trim <- function (x) {
x <- gsub("^\\s+|\\s+$|", "", x)
gsub("\\s+", " ", x)
}
testString<- " This is a test. "
trim(testString)
Ответы
Ответ 1
Вот вариант:
gsub("^ +| +$|( ) +", "\\1", testString) # with Frank input, and Agstudy style
Мы используем группу захвата, чтобы убедиться, что несколько внутренних пространств заменены одним пробелом. Измените "" на \\s
, если вы ожидаете пробела без пробелов, который хотите удалить.
Ответ 2
Использование положительного lookbehind:
gsub("^ *|(?<= ) | *$",'',testString,perl=TRUE)
# "This is a test."
Объяснение:
## "^ *" matches any leading space
## "(?<= ) " The general form is (?<=a)b :
## matches a "b"( a space here)
## that is preceded by "a" (another space here)
## " *$" matches trailing spaces
Ответ 3
Вы можете просто добавить \\s+(?=\\s)
в исходное регулярное выражение:
gsub("^\\s+|\\s+$|\\s+(?=\\s)", "", x, perl=T)
См. DEMO
Ответ 4
Вы запросили опцию gsub
и получили хорошие варианты. Там также rm_white_multiple
из "qdapRegex":
> testString<- " This is a test. "
> library(qdapRegex)
> rm_white_multiple(testString)
[1] "This is a test."
Ответ 5
Если ответ, не использующий gsub
, является приемлемым, то выполняется следующее. Он не использует никаких регулярных выражений:
paste(scan(textConnection(testString), what = "", quiet = TRUE), collapse = " ")
даяние:
[1] "This is a test."
Ответ 6
Вы также можете использовать вложенный gsub
. Менее элегантно, чем предыдущие ответы.
> gsub("\\s+"," ",gsub("^\\s+|\\s$","",testString))
[1] "This is a test."