r:用于包含带否定的模式的正则表达式

r:用于包含带否定的模式的正则表达式,r,regex,R,Regex,假设我有以下两个字符串,并希望使用grep查看哪一个匹配: business_metric_one business_metric_one_dk business_metric_one_none business_metric_two business_metric_two_dk business_metric_two_none 等等,用于各种其他指标。我只想匹配每组的第一个(business\u metric\u one和business\u metric\u two等等)。它们不在有序列表

假设我有以下两个字符串,并希望使用
grep
查看哪一个匹配:

business_metric_one
business_metric_one_dk
business_metric_one_none
business_metric_two
business_metric_two_dk
business_metric_two_none
等等,用于各种其他指标。我只想匹配每组的第一个(
business\u metric\u one
business\u metric\u two
等等)。它们不在有序列表中,因此我无法编制索引,必须使用
grep
。起初我想做:

*公制。*[^无]$


但这似乎不起作用。有什么想法吗?

您需要使用PCRE模式来过滤字符向量:

x <- c("business_metric_one","business_metric_one_dk","business_metric_one_none","business_metric_two","business_metric_two_dk","business_metric_two_none")
grep("metric(?!.*_(?:dk|none))", x, value=TRUE, perl=TRUE)
## => [1] "business_metric_one" "business_metric_two"
x[1]“业务指标一”“业务指标二”

度量(?。*(?:_dk | u none))
模式匹配

  • metric
    -a
    metric
    子字符串
  • (?!!.\u(?:dk | none))
    -除换行符后跟
    \uuu
    外,不跟任何0+字符,然后是
    dk
    none


注意:如果您只需要匹配包含
度量值且不以
\u dk
\u none
结尾的值,请使用一个变体,其中
(?如果字符串以
\u dk
\u none

结尾,负查找将失败匹配,您也可以这样做:

grep("^([[:alpha:]]+_){2}[[:alpha:]]+$", string, value = TRUE)
# [1] "business_metric_one" "business_metric_two"
或者使用
grepl
匹配
dk
none
,然后在为原始
字符串编制索引时否定逻辑:

string[!grepl("(dk|none)", string)]
# [1] "business_metric_one" "business_metric_two"
简而言之:

string[!grepl("business_metric_[[:alpha:]]+_(dk|none)", string)]
# [1] "business_metric_one" "business_metric_two"
数据:

string = c("business_metric_one","business_metric_one_dk","business_metric_one_none","business_metric_two","business_metric_two_dk","business_metric_two_none")

这里排除值的标准是什么?如果它以
\u dk
\u none
结尾,但仍然包含
度量值
?有一个包含标准(需要包含
度量值
或某些字符串),但如果它包含
\u dk
\u none
,它应该会失败。两个问题:你能解释什么是PCRE模式吗?甚至不知道缩写词代表什么。还有,你能解释一下正则表达式中的一些符号吗,比如括号、!等等?我希望这能成为其他人关于前瞻性否定的指南。@vashts85 PCRE代表与Perl兼容的正则表达式。请参阅。答案不会成为指南,因为它太宽泛了。您可以学习。下面是一个关于它们的示例。