每三位数字有空格的整数的正则表达式会抛出“永无止境的递归”

Regex for integer with spaces every three digits throws "never ending recursion"

提问人:Nakilon 提问时间:8/17/2023 更新时间:8/17/2023 访问量:62

问:

我想验证字符串是否为未定义长度的这种格式的整数。

/\A (?<d> ( ( (\g<d>[[:space:]])? \d)? \d)? \d) \z/x === "12 123 123"

但它抛出了

SyntaxError: never ending recursion
正则表达式 Ruby 递归-正则表达式

评论

2赞 Wiktor Stribiżew 8/17/2023
为什么不呢?/\A\d{1,3}(?: \d{3})*\z/
0赞 Nakilon 8/17/2023
@WiktorStribiżew好点!您可以将其作为答案发布,但我希望有人能解释为什么我的答案不起作用。
0赞 Wiktor Stribiżew 8/17/2023
你的理由是什么?
0赞 dawg 8/17/2023
旁注:不建议使用 Ruby 大小写匹配运算符进行正则表达式匹配。请改用。====~
1赞 The fourth bird 8/17/2023
我认为,如果你稍微简化一下模式,那么你就会定义组,并立即引用定义组中的表达式,并将继续循环。没有退出条款。\A(?<d>\g<d>)\z

答:

1赞 Wiktor Stribiżew 8/17/2023 #1

看来你可以使用

/\A\d{1,3}(?: \d{3})*\z/

或者,要支持任何类型的空格:

/\A\d{1,3}(?:[[:space:]]\d{3})*\z/
/\A\d{1,3}(?:\p{Z}\d{3})*\z/

细节

  • \A- 字符串的开头
  • \d{1,3}- 一位、两位或三位数字
  • (?:[[:space:]]\d{3})*- 零次或多次出现空格,然后是三位数字
  • \z- 字符串末尾。

请参阅 Rubular 演示

另外,请参阅检查字符串是否与 ruby 中的正则表达式匹配的最快方法?如何检查字符串是否与 Ruby 中的正则表达式匹配。简而言之,它是.your_pattern.match?(your_string)