替换保持区分大小写的字符串
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 具体的,并且正则表达式页面有关于其使用的警告,您应该阅读。
基本上我有 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 具体的,并且正则表达式页面有关于其使用的警告,您应该阅读。