我想制作正则表达式,允许手机号码从7到26位,但8位和9位除外。
我试过这个,但它不起作用:
^\d(?:[-\s]?\d){6,}((?!\d(?:[-\s]?\d){7}).)((?!\d(?:[-\s]?\d){8}).)((?!\d(?:[-\s]?\d){9,26}).)$
允许输入:数字7到26(但不是8或9位)
不允许输入:
答案 0 :(得分:0)
答案 1 :(得分:0)
答案 2 :(得分:0)
你的正则表达式允许或任何一对数字之间的空格或连字符,这是一个要求吗?假设它是,我将使用这个:
^\d(?!(?:[-\s]?\d){7,8}$)(?:[-\s]?\d){6,25}$
我认为你的正则表达式最大的问题是前瞻的放置。它们必须在正则表达式的开头用于做任何好事。正则表达式中发生的事情是\d(?:[-\s]?\d){6,}
消耗它可以包含的所有数字,然后在字符串的末尾应用前瞻,其中不再有任何类型的字符。因此,作为否定的先行者,他们总是成功。
另一个问题是每个前瞻后面的点(.
);因为它们不在前瞻之内,并且封闭的组不是可选的,每个点必须消耗一个字符,任何范围量词都不会占用(特别是最后一个,{9,26}
),并且不仅限于匹配数字,连字符或空格。
看起来你正试图使用this answer中演示的专属前瞻语(我称之为)。在这种情况下它没用。