Regex 过滤器/grep函数行为异常

Regex 过滤器/grep函数行为异常,regex,r,Regex,R,使用以下代码仅从字符串列表中选择字母数字字符串: isValid = function(string){ return(grep("^[A-z0-9]+$", string)) } strings = c("aaa", "test@test.com", "", "valid") print(Filter(isValid, strings)) 输出为“aaa”test@test.com“ 为什么“有效”没有输出,为什么test@test.com“已输出?您可以使用此命令执行相反的方向,并

使用以下代码仅从字符串列表中选择字母数字字符串:

isValid = function(string){
  return(grep("^[A-z0-9]+$", string))
}

strings = c("aaa", "test@test.com", "", "valid")

print(Filter(isValid, strings))
输出为“aaa”test@test.com“


为什么
“有效”
没有输出,为什么
test@test.com“
已输出?

您可以使用此命令执行相反的方向,并排除任何带有标点符号的字符串,即

isValid <- function(string){
  v1 <- string[!string %in% grep('[[:punct:]]', string, value = TRUE)] 
  return(v1[v1 != ''])
  }
isValid(strings)
#[1] "aaa"   "valid"

isValidFilter
函数接受一个逻辑向量,您提供了一个数字。使用
grepl

isValid = function(string){
  return(grepl("^[A-z0-9]+$", string))
}

strings = c("aaa", "test@test.com", "", "valid")

print(Filter(isValid, strings))
[1] "aaa"   "valid"
为什么
grep
不工作?这是由于R将数值强制为逻辑值,以及
过滤器的怪异性

下面是发生的情况,
grep(“^[A-z0-9]+$”,string)
正确返回
14
。这是第一个和第四个元素的匹配索引

但这不是
过滤器的工作方式。它使用
作为.logical(unlist(lappy(x,f))
在每个元素上运行条件

所以它运行了
isValid(字符串[1])
然后
isValid(字符串[2])
等等。它创造了这个:

[[1]]
[1] 1

[[2]]
integer(0)

[[3]]
integer(0)

[[4]]
[1] 1
然后调用该列表中的
unlist
,以获取
11
,并将其转换为逻辑向量
TRUE
。所以最后你得到了:

strings[which(c(TRUE, TRUE))]
变成

strings[c(1,2)]
[1] "aaa"           "test@test.com"

故事的寓意是,不要使用
Filter
:)

所以逻辑是,如果有任何非字母数字代码,那么就不要输出字符串?不,关键是你需要使用
[A-Za-z0-9]
,但我发现它仍然不起作用。使用
字符串[grepl(^[:alnum:]+$,strings)]
返回(grep(^[A-Za-z0-9]+$”,字符串,value=TRUE))
似乎适合我。