优化正则表达式以匹配大于或等于50的数字

时间:2017-08-21 13:01:55

标签: regex

我想使用正则表达式检查数字是否为50或更多。这本身没问题,但是数字字段有另一个正则表达式,检查输入数字的格式。

该号码将采用大陆格式:123.456,78(三位数组之间的点,最后一个逗号为2位数字)

示例:

100.000,00
50.000,00
50,00
34,34
etc.

我想要捕获50或更多的数字。因此,从上面的四个例子中,前三个应该匹配。

我想出了这个相当复杂的一个,我想知道是否有更简单的方法来做到这一点。

^(\d{1,3}[.]|[5-9][0-9]|\d{3}|[.]\d{1,3})*[,]\d{2}$

修改

我想在这里匹配大陆号码。由于内部规定并指定价格,这些数字具有此格式。 示例:1000欧元将写为1.000,00欧元 50000为50.000,00等。

4 个答案:

答案 0 :(得分:1)

显然,这是一个品味问题,但使用否定前瞻提供了一个简单的解决方案。

^(?!([1-4]?\d),)[1-9](\d{1,2})?(\.\d{3})*,\d{2}\b

单词:从边界开始忽略所有以1位数或2位数开头的数字(第一位是1,2,3或4),后跟逗号。

检查regex101.com

答案 1 :(得分:0)

尝试:

编辑 <div style="width:100px; height:60px; border: 1px solid black; overflow-x: auto; font-size: 14px;float:left"> <div style="float:left;margin-right:10px"> <table border=1 cellpadding=10 style="float:left"> <th>Lorem</th><th>Ipsum</th><th>Sit</th><th>Dolor</th><th>Amet</th> </table> </div> <div style="float:left;margin-right:10px"> <table border=1 cellpadding=10 style="float:left"> <th>Lorem2</th><th>Ipsum2</th><th>Si2t</th><th>Dolor2</th><th>Amet2</th> </table> </div> </div>

检查是否:

  • ^(.{3,}|[5-9]\d),\d{2}$
  • 之前有3个字符或更多字符
  • ,之前有2个数字,第一个在5到9之间
  • 然后是,和2个数字

Donno如果它回答了你的问题,因为它会返回true:

  • aa50,00
  • 1sdf,54

但是这假设您的原始字符串是您期望的格式的数字(因为它不是您问题中的要求)。

编辑3

下面的正则表达式测试数字是否有效,参考大陆格式,如果它等于或大于50.请参阅tests here

正则表达式:,

说明(d是数字):

  • ^((([1-9]\d{0,2}\.)(\d{3}\.){0,}\d{3})|([1-9]\d{2})|([5-9]\d)),\d{2}$([1-9]\d{0,2}\.)d.dd.一次,第一个ddd.介于1和9之间。
  • d(\d{3}\.){0,}零或x时间
  • ddd.\d{3} 3位

这3个部分组合匹配任何等于或大于1000的数字,如:ddd1.00022.002

  • 100.000.000:100到999之间的任何数字。

  • ([1-9]\d{2}):5到9之间的数字,后跟一个数字。匹配50到99之间的任何内容。 所以它可以是上面的部分之一,也可以是这部分。

然后([5-9]\d))匹配逗号和最后两位数字。

答案 2 :(得分:0)

我已命名所有内部组,以便更好地了解每个组匹配的数字部分。在了解其工作原理后,请将所有// Pin ParseQuery results List<ParseObject> objects = query.find(); // Online ParseQuery results ParseObject.pinAllInBackground(objects); // Query the Local Datastore ParseQuery<ParseObject> query = ParseQuery.get("Feed") .fromLocalDatastore() .whereEquals("starred", true) .findInBackground(new FindCallback() { public void done(List<ParseObject> objects, ParseException e) { // Update UI } }); ParseObject feed = ParseQuery.get(objectId); // Online ParseQuery result feed.fetch(); feed.put("starred", true); // No network connectivity feed.saveEventually(); ParseQuery<ParseObject> query = ParseQuery.get("Feed") .fromLocalDatastore() .whereEquals("starred", true) .findInBackground(new FindCallback() { public void done(List<ParseObject> objects, ParseException e) { // "feed" ParseObject will be returned in the list of results } }); 更改为?P<..>

这个是针对大陆格式的任何十进制数。

?:

test

这个与限制^(?P<common_int>(?P<int>(?P<int_start>[1-9]\d{1,2}|[1-9]\d|[1-9])(?P<int_end>\.\d{3})*|0)(?!,)|(?P<dec_int_having_frac>(?P<dec_int>(?P<dec_int_start>[1-9]\d{1,2}|[1-9]\d|[1-9])(?P<dec_int_end>\.\d{3})*,)|0,|,)(?=\d))(?P<frac_from_comma>(?<=,)(?P<frac>(?P<frac_start>\d{3}\.)*(?P<frac_end>\d{1,3})))?$

相同
number>=50

tests

如果你的整数部分总是低于999.999而分形部分总是2位数,那么它会更简单:

^(?P<common_int>(?P<int>(?P<int_start>[1-9]\d{1,2}|[1-9]\d|[1-9])(?P<int_end>\.\d{3})+|(?P<int_short>[1-9]\d{2}|[5-9]\d))(?!,)|(?P<dec_int_having_frac>(?P<dec_int>(?P<dec_int_start>[1-9]\d{1,2}|[1-9]\d|[1-9])(?P<dec_int_end>\.\d{3})+,)|(?P<dec_short_int>[1-9]\d{2}|[5-9]\d),)(?=\d))(?P<frac_from_comma>(?<=,)(?P<frac>(?P<frac_start>\d{3}\.)*(?P<frac_end>\d{1,3})))?$

test

答案 3 :(得分:0)

如果您可以保证数字正确形成 - 也就是说,预期正则表达式不会检测到5,0.1无效,那么通过案例数量有限:

  • \d{3}
  • 结尾
  • [5-9]\d
  • 结尾
  • 包含\d{3},
  • 包含[5-9]\d,

实际上没有必要对\.

做任何事情

最简单的正则表达式是为每个单独的代码编写代码:

(\d{3}$|[5-9]\d$|\d{3},|[5-9]\d)

通过合并某些案例,可以使其更加紧凑和高效:

(\d{3}[$,]|[5-9]\d[$,])

如果您还需要验证格式,则需要额外的复杂性。我建议不要试图在一个正则表达式中进行这两种操作。

然而除非你有充分的理由不得不用正则表达式执行此操作,否则我建议不要这样做。将字符串解析为整数,并将其与50进行比较。