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

Regex 需要限制正则表达式中的字符数,regex,Regex,我正在写一封信。此时,它允许任意位数: ^(([1-9]*)|(([1-9]*).([0-9]*)))$ 如何允许总共64位数字?将*替换为{n,m},其中n是最小匹配,m是最大匹配,例如{0,64} 或者是的,如果您想精确匹配64(不少于64),您可以执行{64} 请参阅此参考尝试此正则表达式: ^\d{64}$ 但是,如果您需要十进制数的精度为64(正如所讨论的正则表达式所暗示的),如下面的示例所示 235235236346345634644.465134654621316549854

我正在写一封信。此时,它允许任意位数:

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

如何允许总共64位数字?

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

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


请参阅此参考

尝试此正则表达式:

^\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})
    :这包括所有数字,没有小数点
  • |
    :大逻辑OR
  • (?=[\d.]{65})
    :正向前瞻,只允许数字和点,并确保输入中的字符总数不小于65
  • (?![\d.]{66})
    :负前瞻,只允许数字和点,并确保输入中的字符总数不超过65
  • (?:[1-9]\d*| 0)
    :小数点前的数字不应该有前零,除非它是唯一的数字
  • \.
    :强制小数点只出现一次,而不是多次(lookaheads允许)
  • \d*[1-9]
    :确保小数点后的数字不以零结尾
这符合:

235235236346345634644.4651346546213165498546516854985213242135355
235.2352363463456346444651346546213165498546516854985213242135355
23523523634634563464446513465462131654985.46516854985213242135355
2352352363463456346444651346546213165498546516854985213242135355
0.465168549852132421353551545656456489155456651654654245646564558
2.465168549852132421353551545656456489155456651654654245646564558
并且不匹配:

0352352363463456346444651346546213165498546516854985213242135355
23523523634634563464446513465462131654985.46516854985213242100000
00.46516854985213242135355154565645648915545665165465424564656454
2352352363463456346444651346546213165498546516854985213242
(附言:虽然我不赞成这样做,但尝试它很有趣。)

我对不同的输入进行了测试

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

试试这个正则表达式:

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

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

考虑到你的表情,我想这就是你想要的

祝你好运

正则表达式 查看它

(?=^\d*\.?\d*$)^(\.?\d){64}$
解释 第二行使其与总共64位数字相匹配,可选地与任意数量的点相匹配。第一行排除了带有多个点的字符串。因此,正则表达式将为您提供由64位数字和最大1点组成的字符串

匹配样本 不匹配样本
你能提供样本输入吗?总共64个数字,不包括小数点(64是您的精度吗)?请评论这些数字的有效性(有效,如果没有原因):
.123456789012345671345678901234567890123456789012345678901234
0.1234567890012345678901234567890123456789012345678901234567890123
1.234567890123456790123456789012345678901234567890123456789012345678901234
12.34567890123456789012345678901234567890123456789012345678901234
123456789001234567890123456789012345678901234.
。你也可以做
^(?=[\d.[\d.]{65}]d*.\d*$
@acheong87,这不会将字符串限制为65个字符。前瞻只是确保它不少于65个字符,但不限于65个字符。但你给了我一个更好的主意。用它和消极的前瞻可以解决这个问题,你是对的。我想知道仅仅添加一个$是否就能解决这个问题,即^(?=[\d.]{65}$)\d*\.\d*$。但无论如何,处理零的工作做得很好。我确认
^((?:[1-9]\d{63})|(?:(?=[\d.]{65}$)(?:[1-9]\d*|0)\.\d*[1-9])$
适用于所有示例。它只是用我在前面的评论中建议的内容替换了否定的前瞻性断言。mmdemirbas对他的正则表达式有一个有趣的理解。他将模式移到前视,将量词限制移到实际正则表达式。@crlangois谢谢。我来晚了,我自己想出来的,所以我没有检查。但是谢谢你的意见,谢谢。我来晚了,我自己想出来的,所以我没有检查。但是谢谢你的意见。
(?=^\d*\.?\d*$)     # Can contain maximum one dot in total between digits
^(\.?\d){64}$       # Match exactly 64 digits, dot is optional
2352352363463456346444651346546213165498546516854985213242135355
.2352352363463456346444651346546213165498546516854985213242135355
235235236346345634644.4651346546213165498546516854985213242135355
235.2352363463456346444651346546213165498546516854985213242135355
23523523634634563464446513465462131654985.46516854985213242135355
235235236346345634644465134654621316549854651685498521324213535
2352352363463456346444651346546213165498546516854985213242135355.
..235235236346345634644465134654621316549854651685498521324213535
..2352352363463456346444651346546213165498546516854985213242135355
23523523.63463456346444651346546213165498.546516854985213242135355
23523523.63463456346444651346546213165498.54651685498521324213535