Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Regex仅在字符串中的某个位置之后才允许*_Javascript_Regex - Fatal编程技术网

Javascript Regex仅在字符串中的某个位置之后才允许*

Javascript Regex仅在字符串中的某个位置之后才允许*,javascript,regex,Javascript,Regex,UI中有一个输入字段,必须满足以下三个条件 输入字符串的长度最多为20个字符,且为字母数字 但是,它可以有*但只能在第6个字符之后,不允许使用其他特殊字符 例如Abc123*或Abc1234*或仅Abc1234(直到20个字符) 字符串的总长度为20个字符,但一旦遇到*我们就不允许再使用任何字符 我知道第三个条件对regex的要求可能有点过分,我应该能够使用javascript处理这个问题。 但是,我至少希望使用正则表达式解决前2个条件 我尝试了以下几种方法,但没有达到预期效果: expo

UI中有一个输入字段,必须满足以下三个条件

  • 输入字符串的长度最多为20个字符,且为字母数字

  • 但是,它可以有*但只能在第6个字符之后,不允许使用其他特殊字符

    例如Abc123*或Abc1234*或仅Abc1234(直到20个字符)

  • 字符串的总长度为20个字符,但一旦遇到*我们就不允许再使用任何字符

  • 我知道第三个条件对regex的要求可能有点过分,我应该能够使用javascript处理这个问题。 但是,我至少希望使用正则表达式解决前2个条件

    我尝试了以下几种方法,但没有达到预期效果:

    export function formatInput(value) {
      return value
            .replace(/[^\w*]|_/g, '')
            .replace(new RegExp('(^[\\w]{6})([\\w*]{14}$)’, 'g'), '$1');
    }
    
    我尝试了一些调整,比如如果我删除第一个replace语句,它根本不会过滤掉任何特殊字符

    同样在下面的情况下,它限制我在允许我继续之前输入*作为第7个字符,这也是不正确的

    export function formatInput(value) {
      return value
          .replace(/[^\w*]|_/g, '')
          .replace(new RegExp('(^[\\w]{6})[\\w]', 'g'), '$1')
          .replace(/(\..*)\./g, '$1')
          .replace(new RegExp('(\\*[\\w]{14}).', 'g'), '$1');
    }
    

    我正在努力提高我对正则表达式的了解,因此我上述的尝试可能不正确,我们将非常感谢您的帮助。

    我对您尝试替换正则表达式有点困惑,所以让我分享一个模式,该模式应勾选您描述的3个框:

    ^(?!.{21}|.{1,5}\*)[A-Za-z\d]+\*?$
    
    在线查看

    • ^
      -起锚线
    • (?!.{21}|{1,5}\*)
      -带交替的反向前瞻,以防止位置在星号前跟21个字符或1-5个字符
    • [A-Za-z\d]+
      -1+字母数字字符
    • \*?
      -可选星号
    • $
      -端线锚


    请注意,您也可以使用不区分大小写的标志作为替代,并使用
    ^(?。{21}.{1,5}\*)[A-Z\d]+\*?$

    我对您尝试替换感到有点困惑,所以让我分享一个模式,它应该勾选您描述的3个框:

    ^(?!.{21}|.{1,5}\*)[A-Za-z\d]+\*?$
    
    在线查看

    • ^
      -起锚线
    • (?!.{21}|{1,5}\*)
      -带交替的反向前瞻,以防止位置在星号前跟21个字符或1-5个字符
    • [A-Za-z\d]+
      -1+字母数字字符
    • \*?
      -可选星号
    • $
      -端线锚


    请注意,您也可以使用不区分大小写的标志作为替代,并使用
    ^(?。{21}.{1,5}\*)[A-Z\d]+\*?$

    以下模式满足所有条件。此模式假定除要检查的密码外,
    值中没有其他内容。我也同样关心在一个函数中执行la
    replace
    操作,这个函数应该纯粹是为了验证,所以我编写了下面的函数,只是为了测试以确保符合规定的模式

    const passwordPattern=/^[A-Za-z\d]{6}(?[A-Za-z\d]\*(?!.+){0,14}$/;
    const checkPassword=value=>passwordPattern.test(value);
    console.log(检查密码(“Abc123”);//真的
    console.log(检查密码(“Abc123*”);//真的
    console.log(检查密码(“Abc12*”);//错误-星号出现在位置6之前
    console.log(检查密码(“Abc123*4”);//false-星号后显示其他字符
    
    console.log(检查密码(“1234567890012345678901”);//false->20个字符长度
    以下模式满足您的所有条件。此模式假定除要检查的密码外,
    值中没有其他内容。我也同样关心在一个函数中执行la
    replace
    操作,这个函数应该纯粹是为了验证,所以我编写了下面的函数,只是为了测试以确保符合规定的模式

    const passwordPattern=/^[A-Za-z\d]{6}(?[A-Za-z\d]\*(?!.+){0,14}$/;
    const checkPassword=value=>passwordPattern.test(value);
    console.log(检查密码(“Abc123”);//真的
    console.log(检查密码(“Abc123*”);//真的
    console.log(检查密码(“Abc12*”);//错误-星号出现在位置6之前
    console.log(检查密码(“Abc123*4”);//false-星号后显示其他字符
    
    console.log(检查密码(“1234567890012345678901”);//false->20个字符的长度
    类似的方法可以:

    /^(?:[a-z\d]{6,19}\*|[a-z\d]{1,20})$/gmi
    
    • ^
      -起锚线
    • (?:
      -启动非捕获组
      • [a-z\d]{6,19}\*
        -我们可以有6到19个字母后跟一个星号
      • |
        -布尔或
      • [a-z\d]{1,20}
        -我们可以有1到20个字母
    • -结束非捕获组
    • $
      -端线锚
    • /gmi
      -标志:全局、多行、不区分大小写
      • g
        m
        仅用于regex101目的,以便您可以一次测试多个输入

    类似的方法可以:

    /^(?:[a-z\d]{6,19}\*|[a-z\d]{1,20})$/gmi
    
    • ^
      -起锚线
    • (?:
      -启动非捕获组
      • [a-z\d]{6,19}\*
        -我们可以有6到19个字母后跟一个星号
      • |
        -布尔或
      • [a-z\d]{1,20}
        -我们可以有1到20个字母
    • -结束非捕获组
    • $
      -端线锚
    • /gmi
      -标志:全局、多行、不区分大小写
      • g
        m
        仅用于regex101目的,以便您可以一次测试多个输入

    是20个字符限制的一部分吗?是20个字符限制的一部分吗?我也使用Regex101
    ^(?。{1,5}\*)[A-Za-z\d]{1,19}[A-Za-z\d*]$
    单字符输入失败:Sharp eye@MonkeyZeus。我想我就把它去掉