【问题标题】:RegEx Numeric with Length带长度的正则表达式数字
【发布时间】:2013-02-06 02:38:34
【问题描述】:

如何创建带小数点分隔符的数字正则表达式,但也限制长度

我创建了这个:

^[0-9]([0-9]*[.]?[0-9]){1,10}$

那么 1234567890.1234567890 是有效的,但是使用了 20 个(+1 -> 小数分隔符)字符。

如何限制 10 个字符?

有效:

1234567890
123456789.0
12345678.90
1234567.890
123456.7890
12345.67890
12345.67890
1234.567890
123.4567890
12.34567890
1.234567890

无效:

12345678901
12345678901.
123456789.01
12345678.901
1234567.8901
123456.78901
12345.678901
12345.678901
1234.5678901
123.45678901
12.345678901
1.2345678901
.12345678901

提前致谢

【问题讨论】:

  • 老实说,我只是检查它是否匹配 /^\d+(?:\.\d*)$/ 然后 s/\.//; 并检查长度。
  • .123123. 应该是有效匹配吗?另外,我猜指数符号是不允许的?
  • @LoneShepherd 最好的选择是你说的,但是是动态形式,我也需要控制长度。
  • @TimPietzcker 在我的情况下不能是 .123 或 123。有效。
  • 好吧,那么我的解决方案应该可以正常工作:)

标签: regex limit numeric


【解决方案1】:
^(?:\d{1,10}|(?!.{12})\d+\.\d+)$

说明:

^          # Start of string
(?:        # Either match...
 \d{1,10}  # an integer (up to 10 digits)
|          # or
 (?!.{12}) # (as long as the length is not 12 characters or more)
 \d+\.\d+  # a floating point number
)          # End of alternation
$          # End of string

请注意(如您的示例).123123. 无效。

【讨论】:

  • +1 用于使用花哨的前瞻断言来获得单个正则表达式 :-)
  • @TimPietzker 就像一个魅力......谢谢!我会稍微改变一下^(?:[0-9]{1,10}|(?!.{12})[0-9]+[.][0-9]+)$,因为 C# 中的 \ 字符有问题
【解决方案2】:

如果您不使用正则表达式来计算长度,它会更清晰甚至更快。针对^\d+(?:\.\d+)$ 进行测试,去掉点并取长度。

如果你真的需要它是一个正则表达式,你可以使用lookahead分别检查格式长度:

^\d{1,10}$|^(?=.{11}$)\d+\.\d+$

说明:

^          # At the start of the string
(?:        # either
 \d{1,10}  # up to 10 digits
|          # or
 (?=       # from here
  .{11}    # 11 characters
  $        # to the end
 )         # and as well
 \d+\.\d+  # two dot-separated digit sequences
)          # 
$          # 

【讨论】:

  • 谢谢!此解决方案需要所有 10 位数字。我将其更改为:^\d{1,10}$|^(?=.{1,11}$)\d+\.\d+$ 以允许从 1 到 10 位的变化。
  • 也许我没有在我的例子中阐明这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2011-06-17
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多