如何使用fixed=T
进行grep,但只在字符串的开头?
grep("a.", c("a.b", "cac", "sss", "ca.f"), fixed = T)
# 1 4
我想第一次出现。 [编辑:要匹配的字符串事先不知道,可以是任何东西。 “一个。”仅仅是为了举例]
感谢。
[编辑:我现在解决了这个问题,但其他任何想法都非常受欢迎。我会接受任何替代解决方案作为答案。
s <- "a."
res <- grep(s, c("a.b", "cac", "sss", "ca.f"), fixed = T, value = T)
res[substring(res, 1, nchar(s)) == s]
答案 0 :(得分:9)
如果你想在字符串的开头匹配一个确切的字符串(字符串1)(字符串2),那么只需将字符串2的子集与字符串1的长度相同并使用==,就应该相当快。
答案 1 :(得分:3)
实际上,格雷格 - 你 - 已经提到了最干净的解决方案。我甚至会放弃grep:
> name <- "a#"
> string <- c("a#b", "cac", "sss", "ca#f")
> string[substring(string, 1, nchar(name)) == name]
[1] "a#b"
但如果你真的坚持使用grep,你可以使用Dwins方法,或者遵循令人难以置信的解决方案:
specialgrep <- function(x,y,...){
grep(
paste("^",
gsub("([].^+?|[#\\-])","\\\\\\1",x)
,sep=""),
y,...)
}
> specialgrep(name,string,value=T)
[1] "a#b"
我可能忘了在gsub中包含一些字符。确保你首先保留]符号,然后在字符集中保留 - 最后一个,否则你会收到错误。或者忘掉它,使用自己的解决方案。这个只是为了好玩的缘故: - )
答案 2 :(得分:2)
由于模式中的fixed=T
,您是否要使用.
?在这种情况下,你可以逃避.
这将起作用:
grep("^a\\.", c("a.b", "cac", "sss", "ca.f"))
答案 3 :(得分:1)
如果您只想关注前两个字符,那么只向grep提供那么多信息:
> grep("a.", substr(c("a.b", "cac", "sss", "ca.f"), 1,2) ,fixed=TRUE)
[1] 1
你可以轻松地将它包装成一个函数:
> checktwo <- function (patt,vec) { grep(patt, substr(vec, 1,nchar(patt)) ,fixed=TRUE) }
> checktwo("a.", c("a.b", "cac", "sss", "ca.f") )
[1] 1
答案 4 :(得分:1)
我认为G博士在答案中有解决方案的关键,但没有明确地说出来:模式中的“^”指定“在字符串的开头”。 (“$”表示字符串末尾)
所以他的“^ a。” pattern意味着“在字符串的开头,查找'a'后跟任何一个字符[''']”。
或者您可以使用“^ a”作为模式,除非您不想匹配仅包含“a”的一个字符串。
这有帮助吗?
杰弗里