尝试在字符串中包含模式后,在长字符串("AxB"
可以是任何单词字符)中搜索和替换多个模式,例如"AxxB"
或"x"
。 "["
前缀和"]"
例如"[AxB]"
或"[AxxB]"
,如下例所示。
A 和 B 之间可能出现任何单词字符以及任意数量的单词字符。我只能找到模式但不知道如何通过使用gsub()
和可能的paste()
函数为模式添加前缀和后缀来替换它。有没有办法实现这个目标?
转换以下字符串:
这
"CCBCACBAHGABGGARBJDFDFADFDFBFDFD"
来
"CCBC[ACB]AHG[AB]GG[ARB]JDFDF[ADFDFB]FDFD"
答案 0 :(得分:3)
在我们到达gsub
之前,使用A
匹配A
后跟最少数量的非B
的其他字符。将匹配替换为方括号包围的匹配。下面,x
是输入字符串(如在问题中并在最后的注释中重复)但它可能是这种字符串的字符向量,例如c(x, x)
,它应该仍然有效。没有包使用。
gsub("(A[^A]*?B)", "[\\1]", x)
## [1] "CCBC[ACB]AHG[AB]GG[ARB]JDFDF[ADFDFB]FDFD"
注意:强>
x <- "CCBCACBAHGABGGARBJDFDFADFDFBFDFD"
答案 1 :(得分:2)
txt <- "CCBCACBAHGABGGARBJDFDFADFDFBFDFD"
expected <- "CCBC[ACB]AHG[AB]GG[ARB]JDFDF[ADFDFB]FDFD"
# Find matches.
matches <- regmatches(txt, gregexpr("(?=A).*?(?<=B)", txt, perl=TRUE))[[1]]
matches <- matches[matches != ""]
# Iterate through and make replacements.
for(match in matches){
txt <- gsub(match, paste0("\\[", match, "\\]"), txt)
}
txt == expected # TRUE
我确定有更好的方法来完成gsub
部分。
答案 2 :(得分:0)
使用stringr
包(可以使用gsub
完成类似的操作:
library(stringr)
string <- "CCBCACBAHGABGGARBJDFDFADFDFBFDFD"
str_replace_all(string, pattern = "(A.*?B)", "[\\1]")