'Regex match after last / and first underscore

Assuming I have the following string:

string = "path/stack/over_flow/Pedro_account"

I am intrested in matching the first 2 characters after the last / and before the first _. So in this case the desired out put is:

Pe

What I have so far is a mix of substr and str_extract:

substr(str_extract(string, "[^/]*$"),1,2)

which of course will give an answer but I belive there is a nice regex for it as well, and that is what I'm looking for.



Solution 1:[1]

Using basename to get the last folder name, then substring:

substr(basename("path/stack/over_flow/Pedro_account"), 1, 2)
# [1] "Pe"

Solution 2:[2]

Remove everything till last / and extract first 2 characters.

Base R -

string = "path/stack/over_flow/Pedro_account"
substr(sub('.*/', '', string), 1, 2)
#[1] "Pe"

stringr

substr(stringr::str_remove(string, '.*/'), 1, 2)

Solution 3:[3]

You can use str_match with a capture group:

  • / Match literally
  • ([^/_]{2}) Capture 2 chars other than / or _ in group 1
  • [^/]* Match optional chars other than /
  • $ End of string

See a regex demo and a R demo.

Example

library(stringr)
string = "path/stack/over_flow/Pedro_account"
str_match(string, "/([^/_]{2})[^/]*$")[,2]

Output

[1] "Pe"

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 zx8754
Solution 2 Ronak Shah
Solution 3 The fourth bird