RegEx -允许在固定长度的字符串的开头和结尾使用空格

zte4gxcn  于 2023-02-05  发布在  其他
关注(0)|答案(3)|浏览(147)

目前我正在使用一个正则表达式,它满足以下条件:

  • 可以接受字符串开头和结尾的空白
  • 可以接受字符串中间/结尾的连字符
  • 字符长度不应大于10且小于8**(不包括空格)**

我已经创建了下面的正则表达式,但不知何故,长度验证没有按预期工作。
一个月一个月一个月一个月

e0uiprwp

e0uiprwp1#

你应该可以用一个简单的正则表达式来实现这一点,如下所示:^(\s*?)[0-9-]{8,10}(\s*?)$
我相信你的另一个没有起作用,因为否定的lookahead不能被量词{8,10}操作,幸运的是,否定的lookahead实际上是不必要的。
我敢打赌,当你试图这样做的时候,你的正则表达式变得错综复杂了,因为我也遇到过这种情况。

2fjabf4q

2fjabf4q2#

从你原来的正则表达式片段[0-9-]*看起来你只想允许数字和破折号。

  • 允许8 - 10个数字或破折号
  • 开头没有破折号
  • 可以有前导空格和尾随空格

测试用例代码:

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);
});

正则表达式的解释:

anauzrmj

anauzrmj3#

您的模式匹配太多,因为它首先匹配可选的前导空格字符。
但是当它到达示例字符串中的第一位时,在((?!(-))([0-9-]*)){8,10}部分中Assert(?!(-)为真,然后[0-9-]*部分匹配示例字符串中的最后一位。
然后,它可以实现重复量词{8,10},因为它已经在示例串中最后一个数字之后的位置,其中没有-跟随,并且它可以匹配可选数字。
您可以用可选的空格字符后跟一个数字开始该模式,然后匹配7 - 9个数字或连字符:

^\s*[0-9][0-9-]{7,9}\s*$

参见regex101 demo

相关问题