R正则表达式量词破折号vs.逗号,带{stringr}vs.{pointblank}

R正则表达式量词破折号vs.逗号,带{stringr}vs.{pointblank},r,regex,validation,stringr,assertion,R,Regex,Validation,Stringr,Assertion,我注意到在使用包时,R正则表达式量词的一些奇怪行为被写成{min,max}(如中所建议的)或{min-max}。我希望正则表达式能与{min,max}一起工作,而与{min-max}一起失败。但是,在下面的两个示例中,一个使用{min,max},另一个使用{min-max} 示例1按预期工作:pattern\u comma工作,而pattern\u dash不工作。但示例2出人意料地起作用:doi\u模式(逗号)不起作用,而doi\u模式(破折号)起作用 对这个正则表达式有什么建议吗?或者这可能

我注意到在使用包时,R正则表达式量词的一些奇怪行为被写成
{min,max}
(如中所建议的)或
{min-max}
。我希望正则表达式能与
{min,max}
一起工作,而与
{min-max}
一起失败。但是,在下面的两个示例中,一个使用
{min,max}
,另一个使用
{min-max}

示例1按预期工作:
pattern\u comma
工作,而
pattern\u dash
不工作。但示例2出人意料地起作用:
doi\u模式(逗号)
不起作用,而
doi\u模式(破折号)
起作用

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

谢谢大家,所以社区

库(dplyr)
图书馆(stringr)
图书馆(空白点)
#例1
df1%
pointblank::col_vals_regex(
vars(x),
句型
)
#>#tible:2 x 1
#>x
#>   
#> 1 123  
#> 2 68
#失败
df1%>%
pointblank::col_vals_regex(
vars(x),
花样短跑
)
#>错误:“x”中的值应与正则表达式匹配的失败测试单元的超出量:`^\d{1-3}$`。
#>`col_vals_regex()`验证失败,超出了绝对阈值级别(1)。
#>*故障级别(2)>=故障阈值(1)
#例2
df2%
col_vals_regex(
瓦拉斯(内政部),
doi_模式_逗号
)
#>错误:“doi”中的值应与正则表达式匹配的失败测试单元的超出量:`^10\.\d{4,9}/[-.;()/:\w\d]+$`。
#>`col_vals_regex()`验证失败,超出了绝对阈值级别(1)。
#>*故障级别(2)>=故障阈值(1)
#通过
df2%>%
col_vals_regex(
瓦拉斯(内政部),
doi_模式(dash)
)
#>#tible:2 x 1
#>内政部
#>                        
#>1 10.1186/s12872-020-01551-9
#>2 10.1002/cpp.1968

由(v0.3.0)于2021-05-09创建的您不能怀疑:
{min-max}
您需要使用
{min,max}
\d{4-9}
引发异常(使用
sub
尝试,您将得到
无效正则表达式'\d{4-9}',原因是{}的内容无效。

接下来,第二个问题是正则表达式是用默认的TRE正则表达式引擎解析的,并且不能在括号内使用诸如
\w
\w
之类的速记字符类,因此需要使用
[:alnum:][ucode>而不是方括号内的
\w

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

“^10\\.\\d{4,9}/[-.;()/:[:alnum:][uU]+$”
你可以潜得更深

如果使用
test\u col\u vals\u regex
,您可以看到得到的结果:

>df2%>%test\u col\u vals\u regex(vars(doi),“^10\\\.\\d{4,9}/[-.;()/:[:alnum:][u]+$”)
[1] 真的
>df2%>%test\u col\u vals\u regex(vars(doi),“^10\\\.\\d{4-9}/[-.;()/:[:alnum:][u]+$”)
[1] NA
>df2%>%test\u col\u vals\u regex(vars(doi),“^10\\\.\\d{4,9}/[-.;()/:\\w]+$”)
[1] 假的
>df2%>%test\u col\u vals\u regex(vars(doi),“^10\\\.\\d{4-9}/[-.;()/:\\w]+$”)
[1] NA
因此,当正则表达式格式错误时,所有情况都返回
NA
,并跳过对这些项的验证,最后传递它们


结论:在
col\u vals\u regex

中使用您的正则表达式模式之前,请始终测试它们的有效性。
col\u vals\u regex
在哪里学习了
{n-m}
语法
df1%>%pointblank::col_vals_regex(vars(x),pattern_comma)
有效。Hi@WiktorStribiżew,
pattern_comma
在示例1中有效(如预期),但
doi_pattern_comma
在示例2中不起作用(并且
doi_pattern_dash
不起作用)。这对我来说是个谜!