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))
模式匹配
-ametric
子字符串metric
-除换行符后跟(?!!.\u(?:dk | none))
外,不跟任何0+字符,然后是\uuu
或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兼容的正则表达式。请参阅。答案不会成为指南,因为它太宽泛了。您可以学习。下面是一个关于它们的示例。