R 正则表达式量词破折号与 {stringr} 与 {pointblank} 的逗号

R regex quantifier dash vs. comma with {stringr} vs. {pointblank}

我注意到 R 正则表达式量词的一些奇怪行为写成 {min, max}(如 stringr cheatsheet) vs. as {min - max}, when using the pointblank 包中的建议。我希望正则表达式与 {min, max} 一起工作并失败使用 {min - max}。但是,在下面的两个示例中,一个使用 {min, max},一个使用 {min - max}

示例 1 按预期工作:pattern_comma 有效而 pattern_dash 。但是示例 2 出人意料地工作:doi_pattern_comma 工作而 doi_pattern_dash 工作。

关于这个正则表达式有什么建议吗?或者这可能是 pointblank 中的错误(在这种情况下我可以在那里打开一个问题)?

谢谢 SO 社区!

library(dplyr)
library(stringr)
library(pointblank)

# EXAMPLE 1
df1 <- tibble(x = c("123", "68"))
pattern_comma <- "^\d{1,3}$"
pattern_dash <- "^\d{1-3}$"

stringr::str_detect(df1$x, pattern_comma) #pass

#> [1] TRUE TRUE

stringr::str_detect(df1$x, pattern_dash)  #fail

#> Error in stri_detect_regex(string, pattern, negate = negate, opts_regex = opts(pattern)): Error in {min,max} interval. (U_REGEX_BAD_INTERVAL, context=`^\d{1-3}$`)


#pass
df1 %>% 
  pointblank::col_vals_regex(
    vars(x), 
    pattern_comma
  )

#> # A tibble: 2 x 1
#>   x    
#>   <chr>
#> 1 123  
#> 2 68


#fail
df1 %>% 
  pointblank::col_vals_regex(
    vars(x), 
    pattern_dash
  )

#> Error: Exceedance of failed test units where values in `x` should have matched the regular expression: `^\d{1-3}$`.
#> The `col_vals_regex()` validation failed beyond the absolute threshold level (1).
#> * failure level (2) >= failure threshold (1)



# EXAMPLE 2
df2 <- tibble(doi = c("10.1186/s12872-020-01551-9", "10.1002/cpp.1968"))
doi_pattern_comma <- "^10\.\d{4,9}/[-.;()/:\w\d]+$"
doi_pattern_dash <- "^10\.\d{4-9}/[-.;()/:\w\d]+$"

stringr::str_detect(df2$doi, doi_pattern_comma) #pass

#> [1] TRUE TRUE

stringr::str_detect(df2$doi, doi_pattern_dash)  #fail

#> Error in stri_detect_regex(string, pattern, negate = negate, opts_regex = opts(pattern)): Error in {min,max} interval. (U_REGEX_BAD_INTERVAL, context=`^10\.\d{4-9}/[-.;()/:\w\d]+$`)


#fail
df2 %>% 
  col_vals_regex(
    vars(doi), 
    doi_pattern_comma
  )

#> Error: Exceedance of failed test units where values in `doi` should have matched the regular expression: `^10\.\d{4,9}/[-.;()/:\w\d]+$`.
#> The `col_vals_regex()` validation failed beyond the absolute threshold level (1).
#> * failure level (2) >= failure threshold (1)


#pass
df2 %>% 
  col_vals_regex(
    vars(doi), 
    doi_pattern_dash
  )

#> # A tibble: 2 x 1
#>   doi                       
#>   <chr>                     
#> 1 10.1186/s12872-020-01551-9
#> 2 10.1002/cpp.1968

reprex package (v0.3.0)

于 2021-05-09 创建

你一定不要怀疑:{min-max} quantifier does not exist, 你需要用 {min,max}\d{4-9} 抛出异常(用 sub 试试,你会得到 invalid regular expression '\d{4-9}', reason 'Invalid contents of {}' )。

接下来,第二个问题是正则表达式是用默认的TRE正则表达式引擎解析的,不能像\w或[=18那样使用shorthand字符类 =] 里面的括号表达式,所以你 需要在方括号 .

里面使用 [:alnum:]_ 而不是 \w

现在,您知道正确的正则表达式了:

"^10\.\d{4,9}/[-.;()/:[:alnum:]_]+$"

你可以深入研究。

您可以看到如果使用 test_col_vals_regex:

会得到什么结果
> df2 %>% test_col_vals_regex(vars(doi), "^10\.\d{4,9}/[-.;()/:[:alnum:]_]+$")
[1] TRUE
> df2 %>% test_col_vals_regex(vars(doi), "^10\.\d{4-9}/[-.;()/:[:alnum:]_]+$")
[1] NA
> df2 %>% test_col_vals_regex(vars(doi), "^10\.\d{4,9}/[-.;()/:\w]+$")
[1] FALSE
> df2 %>% test_col_vals_regex(vars(doi), "^10\.\d{4-9}/[-.;()/:\w]+$")
[1] NA

因此,所有正则表达式格式错误的情况 return NA 并且跳过这些项目的验证,最后通过它们。

结论:在 col_vals_regex.

中使用它们之前,请始终测试您的正则表达式模式的有效性