我很讨厌阅读正则表达式。
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)
我什么也没得到。我想知道是什么原因导致这两种方法之间的差异,以及将来如何避免此类问题。
答案 0 :(得分:1)
除非您需要 ICU附带的其他功能(通过stringi
,stringr
只是拐杖的辅助包装器),否则就不必麻烦了。
实际上,与基于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
不同)。 >