lf208
lf208

Reputation: 77

Remove nth whitespace from string

I need to remove the nth whitespace from a string.

For example, here I would like to remove the 1st whitespace from my_string <- "this is a string" so that it is now:

"thisis a string"

But I also need to be able to remove e.g., the second whitespace from the original to instead produce:

"this isa string"

How can I do this?

Upvotes: 3

Views: 110

Answers (3)

G. Grothendieck
G. Grothendieck

Reputation: 269654

1) Base R Generate the regular expression using sprintf and then run it with sub. No packages are used.

# input
n <- 2
string <- "this is a string"

s <- sprintf("((\\s+\\S+){%d})\\s+", n-1)
sub(s, "\\1", string)
## [1] "this isa string"

In the special case that n = 1 the above still works but we could alternately use just:

sub("\\s+", "", string)
## [1] "thisis a string"

2) gsubfn Using the same input we can use gsubfn. Define a proto object whose fun method returns "" if the count is n and returns its argument, the matched string, otherwise. This can be easily generalized. For example if we wanted to remove the 2nd, 3rd and 4th instance then if could test count %in% 2:4 instead.

library(gsubfn)

p <- proto(fun = function(., x) if (count == n) "" else x)
gsubfn("\\s+", p, string)
## [1] "this isa string"

Upvotes: 1

akrun
akrun

Reputation: 887158

Here is an option with str_locate/str_sub from stringr - get the start/end position index of all spaces with str_locate_all, then use str_sub to assign those locations to blank ("") and retrun the string

library(stringr)
remove_n_ws <- function(str1, n = 1) {
   
       loc <- str_locate_all(str1, "\\s+")[[1]][n,]
       str_sub(str1, loc[1], loc[2]) <- ""
       str1
}

-testing

> remove_n_ws(my_string, 1)
[1] "thisis a string"
> remove_n_ws(my_string, 2)
[1] "this isa string"
> remove_n_ws(my_string, 3)
[1] "this is astring"

Upvotes: 3

user438383
user438383

Reputation: 6206

This function splits the string based on " ", pastes together the n and n+1'th elements of the split string and then pastes together the rest of the string without the n+1 elements of the split string.

remove_n_ws = function(n, my_string) {  
    sub_str = unlist(strsplit(my_string, " "))
    sub_str[n] = paste(sub_str[n], sub_str[n+1], sep="")
    paste(sub_str[-c(n+1)], collapse=" ")
}
> remove_n_ws(1, my_string)
[1] "thisis a string"
> remove_n_ws(2, my_string)
[1] "this isa string"
> remove_n_ws(3, my_string)
[1] "this is astring"

Upvotes: 4

Related Questions