字符串和基数R正则表达式之间的差异

时间:2018-09-26 22:49:59

标签: r regex

我很讨厌阅读正则表达式。

pattern = "(?<=(?<=[0-9])[dD](?=[0-9]))[0-9]+"

它是自动生成的,因此人类的可读性或效率不是有效性而是有效性。它旨在解析RPG骰子类型语法,例如10d20。具体来说,应该匹配20

如果我在R中使用旧的字符串匹配方法

text = '10d20'
regmatches(text,regexpr(pattern,text,perl = TRUE))

我得到的是20,但是使用更现代的字符串匹配方法

stringr::str_match(text,  pattern)

我什么也没得到。我想知道是什么原因导致这两种方法之间的差异,以及将来如何避免此类问题。

1 个答案:

答案 0 :(得分:1)

除非您需要 ICU附带的其他功能(通过stringistringr只是拐杖的辅助包装器),否则就不必麻烦了。

实际上,与基于tidyverse的pkg(称为stringb)相比,有一个pkg的营销能力要低,它会将“数据放在首位”(例如string[ir])并使您摆脱基本的正则表达式约束。可见:

library(stringb)

pattern <- "(?<=(?<=[0-9])[dD](?=[0-9]))[0-9]+"

text <- '10d20'

text_extract(text, pattern, perl = TRUE)
## [1] "20"

在不依赖大量编译代码依赖性和1-away * stringr抽象的情况下,语法变得更加精巧。贝里西莫!


* TBFair:stringb软件包还具有从基本R函数的1-away抽象,但是更精巧的语法弥补了IMO的麻烦(与stringr不同)。

相关问题