To achieve this, you need a regexp that
- matches an (optional) arbitrary string in front of the _ :
.*
- matches a literal _ :
[_]
- matches everything up to (but not including) the next . and stores it in capturing group no. 1 :
([^.]+)
- matches a literal . :
[.]
- matches an (optional) arbitrary string after the . :
.*
In your call to gsub, you then
- use the regular expression we built in the previous step
- replace the whole string with the contents of the first capturing group:
\\1
(we need to escape the backslash, hence the double backslash)
Example:
gsub(".*[_]([^.]+)[.].*", "\\1", "MA0051_IRF2.xml")