Javascript Regex仅在字符串中的某个位置之后才允许*
UI中有一个输入字段,必须满足以下三个条件Javascript Regex仅在字符串中的某个位置之后才允许*,javascript,regex,Javascript,Regex,UI中有一个输入字段,必须满足以下三个条件 输入字符串的长度最多为20个字符,且为字母数字 但是,它可以有*但只能在第6个字符之后,不允许使用其他特殊字符 例如Abc123*或Abc1234*或仅Abc1234(直到20个字符) 字符串的总长度为20个字符,但一旦遇到*我们就不允许再使用任何字符 我知道第三个条件对regex的要求可能有点过分,我应该能够使用javascript处理这个问题。 但是,我至少希望使用正则表达式解决前2个条件 我尝试了以下几种方法,但没有达到预期效果: expo
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}\*)
-1+字母数字字符[A-Za-z\d]+
-可选星号\*?
-端线锚$
请注意,您也可以使用不区分大小写的标志作为替代,并使用
^(?。{21}.{1,5}\*)[A-Z\d]+\*?$
我对您尝试替换感到有点困惑,所以让我分享一个模式,它应该勾选您描述的3个框:
^(?!.{21}|.{1,5}\*)[A-Za-z\d]+\*?$
在线查看
-起锚线^
-带交替的反向前瞻,以防止位置在星号前跟21个字符或1-5个字符(?!.{21}|{1,5}\*)
-1+字母数字字符[A-Za-z\d]+
-可选星号\*?
-端线锚$
请注意,您也可以使用不区分大小写的标志作为替代,并使用
^(?。{21}.{1,5}\*)[A-Z\d]+\*?$
以下模式满足所有条件。此模式假定除要检查的密码外,值中没有其他内容。我也同样关心在一个函数中执行lareplace
操作,这个函数应该纯粹是为了验证,所以我编写了下面的函数,只是为了测试以确保符合规定的模式
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个字符长度
以下模式满足您的所有条件。此模式假定除要检查的密码外,值中没有其他内容。我也同样关心在一个函数中执行lareplace
操作,这个函数应该纯粹是为了验证,所以我编写了下面的函数,只是为了测试以确保符合规定的模式
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。我想我就把它去掉