-1

上次我被要求检查至少 8 位数字的字符串。我得到了以下正则表达式:

    /^(?=(.*\d){8,})[\d\(\)\s+-]{8,}$/

你可以在这里看到问题:Checking string with minimum 8 digits using regex

现在我想限制字符串在同一个正则表达式中接受最多 14 位数字。我试过这个:

   /^(?=(.*\d){8,14})[\d\(\)\s+-]{8,}$/

没运气。请任何人帮助我解决这个问题。

更新

在获得 2 票反对后,我想最好自己写。我使用以前的正则表达式构建了正则表达式。以下正则表达式对我有用:

    /^(?=(.*\d){8})(?!(.*\d){15})[\d\(\)\s+-]{8,}$/
4

4 回答 4

5

根据您的要求,正则表达式应该很简单:

/^\d{8,14}$/
于 2012-12-05T06:52:27.567 回答
3

从您的回答和其他问题来看,您似乎正在将一大堆不同的规则编码为一个越来越复杂的正则表达式:

  1. 字符串必须至少有 12 个字符长
  2. 它只能包含数字、括号、+ 和 - 符号以及空格
  3. 必须有 8 到 14 位数字

虽然可以使用正则表达式来做到这一点,但这值得吗?我认为如此复杂的正则表达式是无法阅读的,因此难以维护。

如果你把不同的标准分开,它会更清楚。

  1. string.length >= 12
  2. string =~ /^[\d()+-\s]+$/- 请注意,通过使用方括号创建字符类,您不需要转义内容,这也使其变得更加简单。
  3. (8..14).include?(string.count("0-9")) - 查看文档String#count

所以,总的来说,

def valid?(string)
  string.length >= 12 &&
    string =~ /^[\d()+-\s]+$/ &&
    (8..14).include?(string.count("0-9"))
end

它有点长,但它更容易理解。

于 2012-12-05T13:36:37.150 回答
1

尝试:

/^(?=(.*\d){8,14}(?!.*\d))[\d\(\)\s+-]{8,}$/

如果我正确放置了否定前瞻,我应该无法匹配超过 14 位数字的字符串。

于 2012-12-05T07:27:50.573 回答
0

如果之前的正则表达式达到了您想要的效果,请尝试在“8”的第二个实例之后添加 14 - 但它确实比 8-14 位数字更复杂!

于 2012-12-05T06:56:32.427 回答