我想要一个正则表达式来匹配任何不正确的数学数字。下面的列表是作为regex输入的示例列表:
1
1.7654
-2.5
2-
2.
m
2..3
2....233..6
2.2.8
2--5
6-4-9因此,前三个(在Bold中)不应该被选中,其余的应该被选中。这是一个与另一个职位密切相关的话题,但由于它的负面性质,它是不同的。
我用的是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)其中产出:
\[1\] 1 2 3 4 5 7 8 9 10 11发布于 2015-07-13 15:27:06
a[grep("^-?\\d*(\\.?\\d*)$", a, invert=T)]与建议编辑从@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发布于 2015-07-13 15:25:54
您可以使用以下regex:
^(?:((\d+(?=[^.]+|\.{2,})).)+|(\d\.){2,}).*|[^\d]+$见演示https://regex101.com/r/tZ3uH0/6
请注意,regex引擎应该支持变量length.and的前瞻性,您需要使用multi-line标志,正如注释中提到的,您可以在R中使用perl=T来主动向前看。
此正则表达式包含与OR.first部件连接的两个部分,如下所示:
(?:((\d+(?=[^.]+|\.{2,})).)+|(\d\.){2,}).*它将匹配除点或2或更多dot.which以外的任何数字后面的任何数字的组合,所有这些都在一个可以重复的捕获组中,而不是这个组,您可以有一个数字,后面跟着点2或更长的时间(用于匹配一些字符串,如2.3.4.)。
在第二部分,我们有[^\d]+,它将匹配除数字以外的任何东西。

发布于 2015-07-13 15:20:50
我认为这应该能做好:
re <- "^-?[0-9]+$|^-?[0-9]+\\.[0-9]+$"
R> a[!grepl(re, a)]
#[1] "2-" "2." "m" "2..3" "2....233..6" "2.2.8" "2--5"
#[8] "6-4-9" https://stackoverflow.com/questions/31386999
复制相似问题