R: Find the last dot in a string

Someone posted the following answer which I really liked, but I notice that they've deleted it:

regexpr("\\.[^\\.]*$", x)

I like it because it directly produces the desired location, without having to search through the results. The regexp is also fairly clean, which is a bit of an exception where regexps are concerned :)


Does this work for you?

x <- "hello.world.123.456"
g <- regexpr("\\.[^\\.]*$", x)
g
  • \. matches a dot
  • [^\.] matches everything but a dot
  • * specifies that the previous expression (everything but a dot) may occur between 0 and unlimited times
  • $ marks the end of the string.

Taking everything together: find a dot that is followed by anything but a dot until the string ends. R requires \ to be escaped, hence \\ in the expression above. See regex101.com to experiment with regex.


How about a minor syntax improvement?

This will work for your literal example where the input vector is of length 1. Use escapes to get a literal "." search, and reverse the result to get the last index as the "first":

 rev(gregexpr("\\.", x)[[1]])[1]

A more proper vectorized version (in case x is longer than 1):

 sapply(gregexpr("\\.", x), function(x) rev(x)[1])

and another tidier option to use tail instead:

sapply(gregexpr("\\.", x), tail, 1)

Tags:

Regex

R