3

我正在写一个正则表达式。此时它允许任意位数:

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

如何总共允许 64 位数字?

4

4 回答 4

3

正则表达式

看到它在行动

(?=^\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
于 2012-08-31T06:56:29.667 回答
1

试试这个正则表达式:

^\d{64}$

红色链接

但是,如果您需要一个十进制数的精度为 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}):这涵盖了所有数字,没有小数点。
  • |: 大逻辑或。
  • (?=[\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 链接上测试了不同的输入。

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

于 2012-08-30T18:18:40.733 回答
0

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

或者是的,如果您想完全匹配 64(不少于),您可以执行 {64}。

请参阅此参考正则表达式语言 - 快速参考

于 2012-08-30T18:17:45.493 回答
0

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

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

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

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

祝你好运!

于 2012-08-30T19:41:30.710 回答