在 R 中反转正则表达式

Inverting a regex in R

我有这个字符串:

[1] "19980213"    "19980214"    "19980215"    "19980216"    "19980217"    "iffi"        "geometry"   
[8] "date_consid"

并且我想匹配所有不是日期且不是“date_consid”的元素。我试过了

res =  grep("(?!\d{8})|(?!date_consid)", vec, value=T)

但我就是做不到...

您可以使用

vec <- c("19980213", "19980214", "19980215", "19980216","19980217", "iffi","geometry", "date_consid")
grep("^(\d{8}|date_consid)$", vec, value=TRUE, invert=TRUE)
## => [1] "iffi"     "geometry"

R demo

^(\d{8}|date_consid)$ 正则表达式匹配仅包含任意八位数字或等于 date_consid.

的字符串

value=TRUE 生成 grep return 值而不是索引,并且 invert=TRUE 反转正则表达式匹配结果(returns 那些不匹配的) .

您尝试的模式给出了所有匹配项,因为前瞻未锚定。

使用带有或 | 的单独语句仍会匹配所有字符串。

你可以换个逻辑从字符串的开头断言,直接右边的不是8位,也不是单次检查date_consid。

使用正向前瞻,您必须添加 perl=T 并添加一个锚点 ^ 来断言字符串的开头,并添加一个锚点 $ 来断言字符串的结尾前瞻后的字符串。

 ^(?!\d{8}$|date_consid$)
  • ^ 字符串开头
  • (?! 否定前瞻
    • \d{8}$ 匹配 8 位数字直到字符串结束
    • |
    • date_consid$匹配 date_consid 直到字符串结束
  • ) 关闭前瞻

例如

vec <- c("19980213", "19980214", "19980215", "19980216","19980217", "iffi","geometry", "date_consid")
grep("^(?!\d{8}$|date_consid$)", vec, value=T, perl=T)

输出

[1] "iffi"     "geometry"