Javascript RegEx:用于限制字母数字字符的总长度,包括所有组

Javascript RegEx:用于限制字母数字字符的总长度,包括所有组,javascript,regex,Javascript,Regex,我已经编写了正则表达式,用于选择应满足以下条件的字母数字字符 它可以从a-z或0-9开始 它最多可以有两个“-”或两个空格字符 长度应为10,不包括“-”和空格 /(^([a-z]|[0-9])*)[-\s]?(([a-z]|[0-9])*)[-\s]?(([a-z]|[0-9])*)$/i 这将满足上述两个条件,但它也将选择10个字母数字以上的字符串 对此有任何想法。以下方法应该有效: ^[a-z0-9]([^- ]{9}|(?=[^- ]*-[^- ]*$).{10}|(?=[^- ]*

我已经编写了正则表达式,用于选择应满足以下条件的字母数字字符

  • 它可以从a-z或0-9开始
  • 它最多可以有两个“-”或两个空格字符
  • 长度应为10,不包括“-”和空格

    /(^([a-z]|[0-9])*)[-\s]?(([a-z]|[0-9])*)[-\s]?(([a-z]|[0-9])*)$/i
    
  • 这将满足上述两个条件,但它也将选择10个字母数字以上的字符串


    对此有任何想法。

    以下方法应该有效:

    ^[a-z0-9]([^- ]{9}|(?=[^- ]*-[^- ]*$).{10}|(?=[^- ]*-[^- ]*-[^- ]*$).{11}|(?=[^- ]* [^- ]*$).{10}|(?=[^- ]* [^- ]* [^- ]*$).{11})$
    
    即a-z或0-9的一个字符后跟以下任一字符:

    • 9个既不是空格也不是破折号的字符
    • 10个字符,其中一个是破折号,没有一个是空格
    • 11个字符,正好有两个是破折号,没有一个是空格
    • 10个字符,其中一个是空格,没有一个是破折号
    • 11个字符,正好有两个是空格,没有一个是破折号
    你可以试试


    当然,这一切都有点糟糕,如果您能帮忙的话,我会劝阻您不要使用正则表达式进行验证。

    以下应该可以:

    ^[a-z0-9]([^- ]{9}|(?=[^- ]*-[^- ]*$).{10}|(?=[^- ]*-[^- ]*-[^- ]*$).{11}|(?=[^- ]* [^- ]*$).{10}|(?=[^- ]* [^- ]* [^- ]*$).{11})$
    
    即a-z或0-9的一个字符后跟以下任一字符:

    • 9个既不是空格也不是破折号的字符
    • 10个字符,其中一个是破折号,没有一个是空格
    • 11个字符,正好有两个是破折号,没有一个是空格
    • 10个字符,其中一个是空格,没有一个是破折号
    • 11个字符,正好有两个是空格,没有一个是破折号
    你可以试试


    当然,这有点糟糕,如果您能帮助的话,我会劝阻您不要使用正则表达式进行验证。

    通过JavaScript字符串方法可以更容易地实现所需的结果

    详细信息:

    • -从
      字符串
      对象中提取满足
      RegExp
      对象提供的模式的每个字符返回包含匹配项的数组

    • -使用给定的分隔符连接字符串数组中的每个项

    (提取器)

    • \w+
      -匹配1个或多个重复的字母数字字符
    (验证器)

    • ^
      -匹配字符串的开头

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

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

    • $
      -匹配字符串的结尾

    let verify=str=>{
    if(验证器测试(str)){
    让len=str.match(提取器).join(“”).length;
    log(len==10?'Valid!':'Invalid!');
    }否则
    console.log('Invalid!');
    }
    让str1=‘24克拉魔法’;
    让str2=‘你的形状’;
    让提取器=/\w+/g;
    让验证器=/^\w+[\-\s]\w*[\-\s]\w*$/;
    验证(str1);
    
    验证(str2)通过JavaScript字符串方法可以更容易地实现所需的结果

    详细信息:

    • -从
      字符串
      对象中提取满足
      RegExp
      对象提供的模式的每个字符返回包含匹配项的数组

    • -使用给定的分隔符连接字符串数组中的每个项

    (提取器)

    • \w+
      -匹配1个或多个重复的字母数字字符
    (验证器)

    • ^
      -匹配字符串的开头

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

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

    • $
      -匹配字符串的结尾

    let verify=str=>{
    if(验证器测试(str)){
    让len=str.match(提取器).join(“”).length;
    log(len==10?'Valid!':'Invalid!');
    }否则
    console.log('Invalid!');
    }
    让str1=‘24克拉魔法’;
    让str2=‘你的形状’;
    让提取器=/\w+/g;
    让验证器=/^\w+[\-\s]\w*[\-\s]\w*$/;
    验证(str1);
    
    验证(str2)您可以使用以下正则表达式:

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

    ^
    从字符串开头开始

    (?!
    开始负面展望

    (?:
    启动非捕获组

    *?
    查找任何字符中的零个或多个字符(非贪婪)

    [-]
    查找受限字符

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

    (?:
    启动非捕获组

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

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

    $
    匹配字符串的结尾

    诀窍:使用neagtivelookahead将限制字符数


    使用“
    (?:[a-z0-9][-]?)
    ”将只计算字母/数字,而不是限制字符。

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

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

    ^
    从字符串开头开始

    (?!
    开始负面展望

    (?:
    启动非捕获组

    *?
    查找任何字符中的零个或多个字符(非贪婪)

    [-]
    查找受限字符

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

    (?:
    启动非捕获组

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

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

    $
    匹配字符串的结尾

    诀窍:使用neagtivelookahead将限制字符数

    使用“
    (?:[a-z0-9][-]?)
    ”将只计算字母/数字,而不是限制字符。