目前我正在使用一个正则表达式,它满足以下条件:
我已经创建了下面的正则表达式,但不知何故,长度验证没有按预期工作。一个月一个月一个月一个月
e0uiprwp1#
你应该可以用一个简单的正则表达式来实现这一点,如下所示:^(\s*?)[0-9-]{8,10}(\s*?)$我相信你的另一个没有起作用,因为否定的lookahead不能被量词{8,10}操作,幸运的是,否定的lookahead实际上是不必要的。我敢打赌,当你试图这样做的时候,你的正则表达式变得错综复杂了,因为我也遇到过这种情况。
^(\s*?)[0-9-]{8,10}(\s*?)$
{8,10}
2fjabf4q2#
从你原来的正则表达式片段[0-9-]*看起来你只想允许数字和破折号。
[0-9-]*
测试用例代码:
const regex = /^(?!\s*-)\s*[0-9-]{8,10}\s*$/; [ '1234567', ' 123 456 7 ', '12345678', '1234567-', '123-5678', '-2345678', ' 12345678 ', ' 123 456 78 ', '12345678', '12345678 ', '12 34 56 78 ', '123456789', ' 123456789', ' 12 34 56 78 9', '1234567890', ' 123 456 7890', '12345678901' ].forEach(str => { let ok = regex.test(str); console.log('"' + str + '" ==> ' + ok); });
正则表达式的解释:
^
(?!\s*-)
\s*
[0-9-]{8,10}
$
anauzrmj3#
您的模式匹配太多,因为它首先匹配可选的前导空格字符。但是当它到达示例字符串中的第一位时,在((?!(-))([0-9-]*)){8,10}部分中Assert(?!(-)为真,然后[0-9-]*部分匹配示例字符串中的最后一位。然后,它可以实现重复量词{8,10},因为它已经在示例串中最后一个数字之后的位置,其中没有-跟随,并且它可以匹配可选数字。您可以用可选的空格字符后跟一个数字开始该模式,然后匹配7 - 9个数字或连字符:
((?!(-))([0-9-]*)){8,10}
(?!(-)
-
^\s*[0-9][0-9-]{7,9}\s*$
参见regex101 demo。
3条答案
按热度按时间e0uiprwp1#
你应该可以用一个简单的正则表达式来实现这一点,如下所示:
^(\s*?)[0-9-]{8,10}(\s*?)$
我相信你的另一个没有起作用,因为否定的lookahead不能被量词
{8,10}
操作,幸运的是,否定的lookahead实际上是不必要的。我敢打赌,当你试图这样做的时候,你的正则表达式变得错综复杂了,因为我也遇到过这种情况。
2fjabf4q2#
从你原来的正则表达式片段
[0-9-]*
看起来你只想允许数字和破折号。测试用例代码:
正则表达式的解释:
^
--字符串起始处的锚点(?!\s*-)
-可选空格和短划线的负先行\s*
--可选空格[0-9-]{8,10}
--8至10位数字/破折号\s*
-可选空格$
--管柱末端的锚***了解有关regex的详细信息:***https://twiki.org/cgi-bin/view/Codev/TWikiPresentation2018x10x14Regex
anauzrmj3#
您的模式匹配太多,因为它首先匹配可选的前导空格字符。
但是当它到达示例字符串中的第一位时,在
((?!(-))([0-9-]*)){8,10}
部分中Assert(?!(-)
为真,然后[0-9-]*
部分匹配示例字符串中的最后一位。然后,它可以实现重复量词
{8,10}
,因为它已经在示例串中最后一个数字之后的位置,其中没有-
跟随,并且它可以匹配可选数字。您可以用可选的空格字符后跟一个数字开始该模式,然后匹配7 - 9个数字或连字符:
参见regex101 demo。