【问题标题】:Inverting a regex in R在R中反转正则表达式
【发布时间】:2021-02-05 11:43:36
【问题描述】:

我有这个字符串:

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

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

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

但我就是不能让它工作......

【问题讨论】:

  • 您不需要或|,您希望两个条件都为真。

标签: r regex stringr


【解决方案1】:

你可以使用

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 返回值而不是索引,invert=TRUE 反转正则表达式匹配结果(返回不匹配的结果)。

【讨论】:

    【解决方案2】:

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

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

    您可以将逻辑更改为从字符串的开头断言,直接在右侧的不是 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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多