匹配一切,但数字正则表达式

Meh*_*ian 5 regex r

我希望有一个正则表达式匹配任何不正确的数学数字.下面的列表是一个示例列表作为正则表达式的输入:

1

1.7654

-2.5

2-

2.

m

2..3

2....233..6

2.2.8

2--5

6-4-9
Run Code Online (Sandbox Code Playgroud)

所以前三个(粗体)不应该被选中,其余的应该被选中.这是另一篇文章的一个密切话题,但由于它的负面性质,它是不同的.

我正在使用R,但我猜任何正则表达式.以下是上述帖子中的最佳镜头:

a <- c("1", "1.7654", "-2.5", "2-", "2.", "m", "2..3", "2....233..6", "2.2.8", "2--5", "6-4-9")
grep(pattern="(-?0[.]\\d+)|(-?[1-9]+\\d*([.]\\d+)?)|0$", x=a)
Run Code Online (Sandbox Code Playgroud)

哪个输出:

\[1\] 1  2  3  4  5  7  8  9 10 11
Run Code Online (Sandbox Code Playgroud)

Pie*_*une 2

a[grep("^-?\\d*(\\.?\\d*)$", a, invert=T)]
Run Code Online (Sandbox Code Playgroud)

根据@Frank 的建议编辑。

速度测试

a <- rep(a, 1e4)
all.equal(a[is.na(as.numeric(a))], a[grep("^-?\\d+(\\.?\\d+)?$|^\\d+\\.$", a, invert=T)])
[1] TRUE

library(microbenchmark)
microbenchmark(dosc = a[is.na(as.numeric(a))],
           plafort = a[grep("^-?\\d*(\\.?\\d*)$", a, invert=T)])
# Unit: milliseconds
#     expr      min       lq     mean   median       uq      max neval
#     dosc 27.83477 28.32346 28.69970 28.51254 28.76202 31.24695   100
#  plafort 31.92118 32.14915 32.62036 32.33349 32.71107 35.12258   100
Run Code Online (Sandbox Code Playgroud)