如何用小写替换最后一个点之后的一些字符

s_t*_*s_t 2 regex r

一个简单的问题,但我无法解决。我得到了一个像这个邮件地址这样的字符串:

ma <- "something@somewhere.COM"
Run Code Online (Sandbox Code Playgroud)

我的目标是获得:

"something@somewhere.com"
Run Code Online (Sandbox Code Playgroud)

所以把最后一个点之后的部分放在小写。我读过thisthis,所以我试过:

gsub(".*\\.","\\L\\1", ma, perl = T) 
[1] "COM" # nope
Run Code Online (Sandbox Code Playgroud)

还有类似的东西:

library(gsubfn)
options(gsubfn.engine = "R")
gsubfn(".*\\.", ~ tolower(x), ma)
[1] "something@somewhere.COM" # nope
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为我似乎可以获取我想要替换的部分:

gsub(".*\\.","", ma)
[1] "COM"
Run Code Online (Sandbox Code Playgroud)

但我无法正确更换它。如果您能给出解决方案的解释,我将不胜感激,正则表达式不是我最强大的功能。

Mic*_*ico 5

\\L&\\U应用于捕获组- 您的第一次尝试很接近,但没有说明将命令应用于哪个组:

ma <-"something@somewhere.COM"
gsub('(.*\\.)(.*)$', '\\1\\L\\2', ma, perl = TRUE)
# [1] "something@somewhere.com"
Run Code Online (Sandbox Code Playgroud)

请注意,我们捕获了两个组——在之前(并包括)的部分.,我们不理会它;而部分之后.,这是我们移动到小写。

另请注意,使用此正则表达式来防止任何贪婪匹配问题可能更安全.

gsub('(.*\\.)([^.]*)$', '\\1\\L\\2', ma, perl = TRUE)
# [1] "something@somewhere.com"
Run Code Online (Sandbox Code Playgroud)