Удалите конечные и ведущие пробелы и дополнительные внутренние пробелы с одним вызовом 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."