正则表达式:用于限制包括所有组的字母数字字符的总长度

时间:2018-10-26 13:22:57

标签: javascript regex

我写了正则表达式来选择应该满足以下条件的字母数字字符。

  1. 它可以以a-z或0-9开头。
  2. 最多可以有两个'-'或最多两个空格字符。
  3. 长度应为10,不能包含'-'和空格。

    /(^([a-z]|[0-9])*)[-\s]?(([a-z]|[0-9])*)[-\s]?(([a-z]|[0-9])*)$/i
    

这将满足上述两个条件,但也会选择比10个字母数字还大的字符串。

对此有任何想法。

4 个答案:

答案 0 :(得分:2)

通过JavaScript String方法可以更轻松地获得所需的结果。

详细信息:

  • String.match(RegExp)-从String对象提取满足RegExp对象提供的模式的每个字符。 返回一个包含匹配项的数组。

  • Array.join(separator)-使用给定的分隔符将String数组中的每个项目连接起来。

(提取器)

  • \w+-匹配 1个或更多重复的字母数字字符。

(验证程序)

  • ^-匹配字符串的开始

  • [\-\s]-匹配'-'' ' 一次

  • \w*-匹配 0个或更多重复的字母数字字符。

  • $-匹配字符串的 end

let verify = str => {
  if(validator.test(str)) {
    let len = str.match(extractor).join('').length;
    console.log(len == 10 ? 'Valid!' : 'Invalid!');
  } else 
    console.log('Invalid!');
}

let str1 = '24-carat magic';
let str2 = 'Shape of you';

let extractor = /\w+/g;
let validator = /^\w+[\-\s]\w*[\-\s]\w*$/;

verify(str1);
verify(str2);

答案 1 :(得分:0)

以下应该可以工作:

^[a-z0-9]([^- ]{9}|(?=[^- ]*-[^- ]*$).{10}|(?=[^- ]*-[^- ]*-[^- ]*$).{11}|(?=[^- ]* [^- ]*$).{10}|(?=[^- ]* [^- ]* [^- ]*$).{11})$

这是a-z或0-9的一个字符,后跟一个:

  • 9个既不是空格也不是破折号的字符
  • 10个字符,其中一个字符是破折号,一个都不是空格
  • 11个字符,其中两个恰好是破折号,一个都不是空格
  • 10个字符,其中一个字符完全是空格,没有一个破折号
  • 11个字符,其中两个恰好是空格,都不是破折号

您可以here试试。

当然,这有点可怕,如果可以的话,我不鼓励您使用正则表达式进行验证。

答案 2 :(得分:0)

您可以使用以下正则表达式:

/^(?!(?:.*?[ -]){3,})(?:[a-z0-9][ -]?){1,10}$/

说明:

^从字符串的开头开始

(?!开始负面展望

(?:启动一个非捕获组

.*?寻找零个或多个字符(非贪心字符)

[ -]查找受限制的字符

{3,}查找该组中的3个或更多(负向超前)

(?:启动一个非捕获组

[a-z0-9][ -]?匹配一个字符/数字,后跟一个可选的受限字符

{1,10}匹配该组的1到10

$匹配字符串的结尾

技巧:使用否定的超前行为将限制字符。

使用'(?:[a-z0-9][ -]?)'仅会计算字母/数字,而不是受限字符。

答案 3 :(得分:0)

@ rv7在您的答案中添加了额外的检查内容

let verify = str => {
  if (validator.test(str)) {
    let len = str.match(extractor).join('').length;
    if (len === 10) {
      if (dashvalidator.test(str)) {
        let dashLength = str.match(dashvalidator).join('').length;
        if (dashLength === 2) {
          console.log('dashvalidator valid')
        } else {
          console.log('dashvalidator Invalid!');
        }
      } else {
        if (spaceValidator.test(str)) {
          str = str.replace(/\s/g, '*');
          let spaceLength = str.match(spaceValidatorHelp).join('').length;
          if (spaceLength === 2) {
            console.log('spaceValidatorHelp valid')
          } else {
            console.log('spaceValidatorHelp Invalid!');
          }
        } else {
          console.log('valid!');
        }
      }
    } else {
      console.log('Invalid!');
    }
  } else
    console.log('Invalid!');
}

let str1 = '24-carat magic';
let str2 = '12 34567 890';

let extractor = /\w+/g;
let validator = /^\w+[\-\s]?\w*[\-\s]?\w*$/;
let dashvalidator = /-/g;
let spaceValidatorHelp = /\*/g;
let spaceValidator = /\s/g;



verify(str1);
verify(str2);

我已经添加了条件检查

  1. 字符串中不允许一个'-'和一个空格。
  2. 它应该没有特殊字符,或者应该有两个'-'或应该有两个空格字符