匹配唯一数字的正则表达式重复N次

时间:2018-02-15 11:49:19

标签: r regex

我想匹配重复N次但只有唯一数字的数字。我对正则表达式解决方案感兴趣。

vec <- c("00", "01", "02", "06", "07", "65", "87", "88", "66", "777", "999999")
grep("^[6-9]{1,}$", vec, value = TRUE)
#> [1] "87"     "88"     "66"     "777"    "999999"

因此,我想仅匹配8866777999987不应该匹配,因为它包含两个不同的数字。

提示?

3 个答案:

答案 0 :(得分:5)

使用反向引用:

grep("^([6-9])\\1{1,}$", vec, value = TRUE)
[1] "88"     "66"     "777"    "999999"

如果要匹配重复N次的数字,则{1}应为N-1,因为您已将第一个匹配作为捕获组。

答案 1 :(得分:1)

您可以使用Perl backreferences

inx <- grep("^([6-9])\\g1", vec, perl = TRUE)
vec[inx]
#[1] "88"     "66"     "777"    "999999"

答案 2 :(得分:0)

当然,这是一个更复杂的解决方案。但我想尝试使用tidyverse

的其他方法
library(stringr)
library(tidyverse),

vec %>% 
  str_split("") %>% 
  keep(function(x) length(unique(x)) == 1 & all(x > 5)) %>% 
  map_chr(paste0, collapse = "")
[1] "88"     "66"     "777"    "999999"