数字之间数字的正则表达式

Posted

技术标签:

【中文标题】数字之间数字的正则表达式【英文标题】:regex for number between numbers 【发布时间】:2016-06-08 10:48:31 【问题描述】:

我需要一个正则表达式,它需要一个最小值和一个最大值来确定有效输入,并且我希望最大值和最小值是动态的。

我一直在尝试使用此链接完成此操作 https://***.com/a/13473595/1866676 但无法让它工作。有人可以告诉我如何做到这一点。


假设我想做一个 html5 输入框,我希望它只接收从 100 到 1999 的数字

这样的正则表达式会是什么样子?

【问题讨论】:

能否请您更新您的问题 1) 具有预期行为的示例输入 2) 您究竟尝试了什么以及如何尝试 3) 当然还有您的编程语言。 我建议你看看How do I write a regular expression that matches an IPv4。它不是一个答案(甚至不是一个论坛),但它读起来很有趣,并强调了为什么你可以用正则表达式做很多事情,但你不应该总是这样做。至于您的问题,如果数字不固定,您显然无法编写静态正则表达式,如果您可以使用编程语言构建表达式,您可能可以使用该语言以更简单的方式比较数字。 @WiktorStribiżew 尝试按照您的要求更新它 例如参见regular-expressions.info/numericranges.html。它可以做到,但它可能不是你想做的事情。最好从您正在解析的任何字符串中提取数字,然后检查它是否在指定范围内。 @DaCh 你在你的问题中写下了他的名字,但并没有真正提供三点中的任何一个;-) 【参考方案1】:

首先,虽然可以这样做,但我认为如果有更简单的方法来选择一个数字范围,例如<input type="number" min="1" max="100">,那么这种方法会更好。

话虽如此,以下是您请求的正则表达式的工作方式:

ones: ^[0-9]$  // just set the numbers -- matches 0 to 9
tens: ^[1-3]?[0-9]$ //set max tens and max ones -- matches 0 to 39
tens where max does not end in 9 ^[1-2]?[0-9]$|^[3][0-4]$ // 0 to 34
only tens: ^[1][5-9]$|^[2-3][0-9]$|^[4][0-5]$ // 15 to 45

在这里,让我们选择一个 1234 到 2345 的任意数字

^[1][2][3][4-9]$|
^[1][2][4-9][0-9]$|
^[1][3-9][0-9][0-9]$|
^[2][0-2][0-9][0-9]$|
^[2][3][0-3][0-9]$|
^[2][3][4][0-5]$

https://regex101.com/r/pP8rQ7/4

基本上中间系列的结尾总是需要一个可以达到 9 的直线范围除非我们正在处理那些地方,如果它不能,你必须向上构建它朝向每次我们有一个不能以 0 开始的值,然后一旦我们达到一个不能以 9 结束的值,就提前中断并将其设置为下一个条件。

注意图案,因为每个地方都会凝固。还要记住,在处理从低位到高位时,可选运算符?应该使用。

它有点复杂,但通过一些思考来设计自定义范围几乎是不可能的。

如果您更具体,我们可以制作一个确切的示例,但通常是这样完成的:beginning-range|middle-range|end-range 在某些情况下,您应该只需要开始或结束范围,例如最小值或最大值不以 9 结尾。意味着它后面的范围是可选的。 (例如,在第一种情况下,它允许我们同时拥有单数和双数。

所以对于 100 - 1999 来说实际上非常简单,因为您有很多 9 和 0

/^[1-9][0-9][0-9]$|^[1][0-9][0-9][0-9]$/

https://regex101.com/r/pP8rQ7/1

注意:单个值不需要范围 [n] 我只是为了可读性添加了它们。

编辑:发现有一个范围生成器。我不知道它有多可靠或稳定,但第一眼看起来不错虽然在:http://gamon.webfactional.com/regexnumericrangegenerator/

【讨论】:

Here, lets pick an arbitrary number 1234 to 2345 如果理解的话。如果我使用那个正则表达式,我可以输入 2344 吗?我说的对吗? 呃等等我犯了一个错误 - 修复 你有我的 +1 信息,但这个表达式需要放在某个地方,它在整个方法开始闪烁的更大的图片中。如果你把它放在<input pattern=""> 属性中,你已经为max/min 编写了一个复杂的替换。如果您使用 javascript 进行验证,您已经为 <> 编写了一个复杂的替换。以此类推。 @ÁlvaroGonzález 我完全同意。这比其他任何事情都更琐碎和发明。我玩得很开心:D @ÁlvaroGonzález 对不起,但你不是说它可能不是 2340 吗?【参考方案2】:

基本上,你不能。

对于每个数字范围,都存在一个匹配该范围内数字的正则表达式,因此可以编写可以生成此类正则表达式的代码。但这样的正则表达式并不是对范围结尾的简单重新格式化。

但是,与仅使用数字方法检查数字的代码相比,编写此类代码需要付出巨大的努力和复杂性。

【讨论】:

不是这方面的专家,但由于是 html5,他需要正则表达式来过滤它。如果不是,他将不得不将值传递到另一个页面来验证它们? ^[1-9][0-9][0-9]$|^1[0-9][0-9][0-9]$ 会抓住一切吗? @Andreas 你是对的。我为此开发了一个系统。这比人们想象的要容易。看看下面的答案虽然像波西米亚人建议的那样,在某些情况下它肯定是矫枉过正 感谢您的建议。我决定改变我的方法,而不是想出一个正则表达式。【参考方案3】:

使用 HTML 5 只需输入范围...

<form>
  Quantity (between 100 and 1999):
  <input type="number" name="quantity" min="100" max="1999">
</form>

使用正则表达式:

^([12345679])(\d)(\d)|^(1)(\d)(\d)(\d)

因此,如果您需要动态创建正则表达式,这是可能的,但有点棘手和复杂

【讨论】:

出于好奇...纯 HTML 是否可以实际执行限制,或者只是相应地设置元素的样式? 值会受到限制,但是注意:Internet Explorer 9 及更早版本不支持输入标签的 max 和 min 属性。-- 注意:max 和 min 属性不适用于日期以及 Internet Explorer 10(和更新版本)或 Firefox 中的时间,因为 IE 10+ 和 Firefox 不支持这些输入类型。--注意:任何人都可以伪造客户端验证,因此在服务器上进行验证也很重要@ 987654321@ 当然任何输入都可以是假客户端,所以你需要一个验证服务器端(javascript可以跳过更困难,但作为正常输入跳过)。

以上是关于数字之间数字的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式仅删除数字之间的空格

使用正则表达式仅提取两个特定标记之间的数字

在 C++ 中使用正则表达式查找 [/ 和 ] 之间的数字

正则表达式匹配字母和数字,其中一些符号可以出现在它们之间

如何仅匹配两个点之间的数字,不包括使用正则表达式的点[重复]

正则表达式捕获两个数字之间的第一个字符串