在 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"
^(\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"
我有这个字符串:
[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"
^(\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"