如何检查字符串是否完全由某些字符串模式组成

时间:2017-07-24 13:51:58

标签: r string stringr stringi

我有一个字符串向量,我需要检查它们是否符合某个标准。例如,如果某个字符串,比如"34|40|65"完全由这些模式构成:c("34", "35", "37", "48", "65"),那么我想返回1,如果它们的字符串不包含任何这些模式,那么我想返回-1。如果字符串包含一些模式,但并不是完全由这些模式组成,那么我想返回0.我已经成功实现了1和-1,但是我遇到了逻辑问题,这会产生0.现在,我的逻辑对于那些应该产生0的字符串,产生1。这是我的代码,用于确定字符串是否包含这些模式之一。这会给我1s。

acds <- c("34", "35", "37", "48", "65")
grepl(paste(acds, collapse = "|"), data$comp_cd)

data$comp_cd是字符串

的向量

谢谢!

3 个答案:

答案 0 :(得分:1)

尝试:(抱歉忽略了-1部分)

acds <- c("34", "35", "37", "48", "65")

# example-vector:
vec <- c("34|35|37", "34|23|99", "65|37|48", "11|22|33", "34a|35a|37a")

# want
res <- vector("numeric", length(vec))
for (i in 1:length(vec)) {
  comp.vec <- unlist(strsplit(vec[i],"[|]"))
  nr.matches <- sum(comp.vec %in% acds)
  res[i] <- ifelse(nr.matches == length(comp.vec), 1,
                   ifelse(nr.matches == 0, -1, 0))
}
print(res)

答案 1 :(得分:0)

您可以通过以下方式查看匹配项:

sapply(strsplit(string,"\\|"), function(x) x %in% patterns)

您可以轻松地将其包装在一个函数中,以根据要求提供数值结果。

checkstring <-function(string,patterns)
{
  matches = sapply(strsplit(string,"\\|"), function(x) x %in% patterns)
  if(sum(matches)==length(matches))
    return(1)
  if(sum(matches)==0)
    return(-1)
  else
    return(0)
}

使用示例:

checkstring("34a|65a",patterns=patterns)
[1] -1
checkstring("34|65",patterns=patterns)
[1] 1
checkstring("34|40|65",patterns=patterns)
[1] 0

希望这有帮助!

答案 2 :(得分:0)

您可以使用intersect来获取此信息,即

f1 <- function(vec, pattern){
  v1 <- strsplit(pattern, '|', fixed = TRUE)[[1]]
  ind <- intersect(v1, vec)
  if(length(ind) == 0){
    return(-1)
  } else if(length(ind) == length(v1)) {
    return(1)
    }else return(0)
}

acds <- c("34", "35", "37", "48", "65")
x <- '34|40|65'

f1(acds, x)
#[1] 0