R正则表达式:"[:digit:]"的意外行为

Dre*_*een 27 regex r

我想从字符向量中提取以数字开头的元素,但是有一些关于POSIX正则表达式语法的东西,我不明白.

我想是的

vec <- c("012 foo", "305 bar", "other", "notIt 7")
grep(pattern="[:digit:]", x=vec)
Run Code Online (Sandbox Code Playgroud)

会返回1 2 4因为它们是其中包含数字的四个元素.但实际上它会回归3 4.

同样按照我的预期grep(pattern="^0", x=vec)返回1,因为元素1以零开头.但是grep(pattern="^[:digit:]", x=vec)返回,integer(0)而我希望它返回,1 2因为那些是以数字开头的元素.

我怎么会误解语法?

Dir*_*tel 34

尝试

grep(pattern="[[:digit:]]", x=vec)
Run Code Online (Sandbox Code Playgroud)

相反,冒号之间的"元模式"通常需要双括号.

  • 它寻找冒号,d,i,g或t. (10认同)
  • 尽管@triplee 的评论(目前有 9 个)赞成,但这是完全错误的。参见例如[此处](http://www.rdocumentation.org/packages/base/functions/regex.html) 以获取有关将`[[:digit:]]` 定义为数字的正则表达式语法的文档。 (2认同)
  • 我理解第一个注释中的问题是什么,`[:digit:]` - 而不是正确的`[[:digit:]]` - 实际上是这样做的. (2认同)

Woj*_*ala 12

另一种方法

grep(pattern="\\d", x=vec)
Run Code Online (Sandbox Code Playgroud)


ali*_*oar 5

man 7 regex
Run Code Online (Sandbox Code Playgroud)

在括号表达式中,"[:"和":]"中包含的字符类的名称代表属于该类的所有字符的列表.标准字符类名称是:

         alnum       digit       punct
         alpha       graph       space
         blank       lower       upper
         cntrl       print       xdigit
Run Code Online (Sandbox Code Playgroud)

因此,作为括号表达式唯一成员的字符类看起来像双括号,例如[[:digit:]].作为另一个例子,考虑[[:alnum:]]相当于[[:alpha:][:digit:]].