使用正则表达式匹配除某些数字外的所有数字

5
我有一个正则表达式,我想在除以下数字之外的任何数字上匹配:
0|1|2|3|4|5|6
^(?!(0|1|2|3|4|5|6)).*
我可以将其匹配到7、8或9,但10及其后面的数字都不起作用,因为它们以我不想匹配的数字开头。
例如,如果我的数字是22,则会匹配。 如果我的数字是2,则不会匹配。

1
([0-6]\d+|[7-9]\d*)? - jsheeran
7个回答

2
我认为这是最快的正则表达式方法(在检查从0到30的每个数字时,只需127步)。

在此处查看正则表达式

\d{2,}|[7-9]
  • \d{2,} 匹配任何2位或更大的数字。
  • [7-9] 如果您想使用排除范围而不是接受范围,则可以使用[^\D0-6]

或者,如果您有更大的机会获得单个数字,则将条件反向以获取[7-9]|\d{2,} 可以提高性能。


1
嗯,首先比你的快:P https://regex101.com/r/lq1h3E/5,但我确实说过要检查从0到30的每个数字。 - ctwheels
不是三个数字匹配模式7-9,没有关系。替代是一个简单的跳跃。所有单个数字都必须跳跃到7-9,如果尾数的话。而且,你怎么知道他的任何样本是2个或更多的数字。统计上,无论有无限多少数字都无所谓。 - user557597
此外,将其限制为仅接受数字而不是您的自由形式是微不足道的开销。 - user557597
让我们在聊天中继续这个讨论 - ctwheels
@sln 我已经将这个问题移到了聊天中。你能帮我清理一下剩下的吗? - ctwheels
我已经删除了“老鼠屁股”的评论,并添加了最后一条聊天评论。没有什么需要清理的了。另外,请查看@TommasoBelluzzo的答案。 - user557597

2
我认为你可以在组后添加一个单词边界\b来更新你的正则表达式,以此为例:

^(?!(0|1|2|3|4|5|6)\b).*

你还可以使用字符范围从0到6替换或语句来简写,例如:

^(?![0-6]\b).*


1

那么,[^0123456]|(\d{2,}) 怎么样?这样你就可以排除不想要的数字,但仍然可以匹配两个或更多位数的数字。


这将匹配 % 或任何不在 0123456 中的字符。 - ctwheels
1
他没有提到非数字字符的存在:“匹配除以下数字以外的任何内容”。 - João Ciocca

1
尝试使用^(?![0-6]$)\d+$,它不会匹配仅包含0-6的字符串,其他数字均可。
使用这个^(?!0*[0-6]$)\d+$将匹配大于6的数字,按数值大小

1
这应该可以完成工作:

^(?:[7-9]|\d{2,})$

访问 this link 来测试正则表达式。


1

+1 我喜欢\b[7-9\b这部分,单词边界是引擎可以执行的最快检查。可能存在一个问题[1-9]\d+,不清楚OP是否关心已解决的_数字_值,例如001可能是可以的。 - user557597
@sln 你可能是对的,但我不认为那是这种情况。他说了数字并且给出了1到6和22的例子。所以... - Srdjan M.

0

使用此代码,您可以匹配除了39以外的数字 /^+(([0-24-9][0-8]?[0-9])|([3][0-8][0-9])|([3]))$/


1
非常感谢您的回答!虽然您的回答并没有直接解决问题,但是解释一下正则表达式如何工作,这样他们就可以理解如何进行调整可能会更好。 - Exelian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接