替换保持区分大小写的字符串

Replacing a character string keeping case sensitivity

基本上我有 2 个字符向量:

x='XYzD- xyZ      ABC'
y='xyz'

这是我能做的最好的了。

gsub(paste0('[^ ',y,' $\$]'), 'X', x, ignore.case = T)

期望的输出是:

   'XXxXX xyZ      XXX' 

这意味着只应保留匹配的字符串,即 y('abc'),因为其他所有内容都根据大小写转换为字母 'X/x'。

举个明显的例子:

x='XYzD- LMn      ABC'
y='lmn'

gsub(paste0('[^ ',y,' $\$]'), 'X', x, ignore.case = T)

在这种情况下所需的输出将是

'XXxXX LMn      XXX' 

我希望这能让事情变得清晰。

这是一个很长的解决方案。但它有效。我正在使用你的第二个例子。基本上,我将所有内容都转换为单个字符,在原始字符中找到小写字母并将 tolower 应用于结果。然后我将所有内容连接回一个字符串。

x='XYzD- LMn      ABC'
y='lmn'

out <-gsub(paste0('[^ ',y,' $\$]'), 'X', x, ignore.case = TRUE)

xx <-unlist(strsplit(x,"")) #split characters on original
out2 <-unlist(strsplit(out,"")) #split characters on result

lower <-grepl("[[:lower:]]",xx) #find lowercase
out2[lower] <-tolower(out2[lower]) #replace lowercase
paste(out2, collapse = "") #concatenate
#[1] "XXxXX LMn      XXX"

这是一个使用嵌套 gsub 的纯正则表达式解决方案。第一个 gsub on caps 的结果后面是第二个 gsub 来处理 lower..

gsub(paste0("[^", y, toupper(y), "A-Z", " ]"), 'x', 
        gsub( paste0("[^", y, toupper(y), "a-z", " ]"), 'X', x) )
[1] "XXxXX LMn      XXX"

它确实依赖于正则表达式中的范围运算符,这在某种程度上是 OS 具体的,并且正则表达式页面有关于其使用的警告,您应该阅读。