需要限制正则表达式中的字符数

时间:2012-08-30 18:14:55

标签: regex

我正在写regex。此时它允许任意数量的数字:

^(([1-9]*)|(([1-9]*).([0-9]*)))$

如何准确地允许64位数字?

4 个答案:

答案 0 :(得分:2)

正则表达式

查看 in action

(?=^\d*\.?\d*$)^(\.?\d){64}$

说明

(?=^\d*\.?\d*$)     # Can contain maximum one dot in total between digits
^(\.?\d){64}$       # Match exactly 64 digits, dot is optional

第二行使其匹配总共64位数,可选择任意数量的点。第一行排除多个点的字符串。因此,正则表达式为您提供由64位数字和最多1个点组成的字符串。

匹配样本

2352352363463456346444651346546213165498546516854985213242135355
.2352352363463456346444651346546213165498546516854985213242135355
235235236346345634644.4651346546213165498546516854985213242135355
235.2352363463456346444651346546213165498546516854985213242135355
23523523634634563464446513465462131654985.46516854985213242135355

不匹配的样本

235235236346345634644465134654621316549854651685498521324213535
2352352363463456346444651346546213165498546516854985213242135355.
..235235236346345634644465134654621316549854651685498521324213535
..2352352363463456346444651346546213165498546516854985213242135355
23523523.63463456346444651346546213165498.546516854985213242135355
23523523.63463456346444651346546213165498.54651685498521324213535

答案 1 :(得分:1)

试试这个正则表达式:

^\d{64}$

Rubular link

但是如果您需要十进制数字的精度为64(正如您所说的正则表达式所示),如下面的示例所示,

235235236346345634644.4651346546213165498546516854985213242135355
235.2352363463456346444651346546213165498546516854985213242135355
23523523634634563464446513465462131654985.46516854985213242135355

在小数点之前和之后可能有一个可变位数,但总共为64,那么最好使用字符串操作从数字中删除小数点,然后应用上面的正则表达式进行验证(或者只是验证字符串的长度。)


如果你真的坚持正则表达式,你可以试试这个:

^((?:[1-9]\d{63})|(?:(?=[\d.]{65})(?![\d.]{66})(?:[1-9]\d*|0)\.\d*[1-9]))$

细分:

  • (?:[1-9]{64}):这涵盖了所有数字,没有小数点。
  • |:大逻辑OR。
  • (?=[\d.]{65}):正面预测只允许数字和点数,并确保输入中的总字符数不少于65.
  • (?![\d.]{66}):否定前瞻,仅允许数字和点数,并确保输入中的总字符数不超过65。
  • (?:[1-9]\d*|0):小数点前的数字不应该有前面的零,除非它是唯一的数字。
  • \.:强制小数点只发生一次而不是更多(正如前瞻所允许的那样)。
  • \d*[1-9]:确保小数点后的数字不以零结尾。

匹配:

235235236346345634644.4651346546213165498546516854985213242135355
235.2352363463456346444651346546213165498546516854985213242135355
23523523634634563464446513465462131654985.46516854985213242135355
2352352363463456346444651346546213165498546516854985213242135355
0.465168549852132421353551545656456489155456651654654245646564558
2.465168549852132421353551545656456489155456651654654245646564558

并不匹配:

0352352363463456346444651346546213165498546516854985213242135355
23523523634634563464446513465462131654985.46516854985213242100000
00.46516854985213242135355154565645648915545665165465424564656454
2352352363463456346444651346546213165498546516854985213242

(PS:虽然我不赞成这个,尝试它很有趣。)

我在Rubular link上测试了不同的输入。

@ acheong87在评论中的积极前瞻帮助我引出了这个正则表达式。

答案 2 :(得分:0)

用{n,m}替换*,其中n是最小匹配,m是最大匹配,例如{0,64}

或者是的,如果你想要完全匹配64(不低于),你可以{64}。

请参阅此参考Regular Expression Language - Quick Reference

答案 3 :(得分:0)

试试这个正则表达式:http://regex101.com/r/qM9mO8

/^(?:\d{64}|(?=.*\.)(?!.*\..*\.)[\d.]{64})$/gm

此正则表达式适用于64个连续数字或63位数和1个点。

考虑到你的表情,我认为这就是你要找的东西。

祝你好运!