29

我想从字符向量中提取以数字开头的元素,但是我不理解 POSIX 正则表达式语法。

我会认为

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

会返回1 2 4,因为它们是其中某处有数字的四个元素。但实际上它返回了3 4

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

我如何误解语法?

4

3 回答 3

38

尝试

grep(pattern="[[:digit:]]", x=vec)

相反,因为冒号之间的“元模式”通常需要双括号。

于 2012-07-17T15:07:32.747 回答
12

另一种解决方案

grep(pattern="\\d", x=vec)
于 2012-07-17T16:15:09.333 回答
6
man 7 regex

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

         alnum       digit       punct
         alpha       graph       space
         blank       lower       upper
         cntrl       print       xdigit

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

于 2012-07-17T15:11:04.553 回答