正则表达式需要在字符串的开头匹配特殊字符

时间:2016-01-20 13:23:07

标签: javascript regex string

我需要修改现有的正则表达式,以便在字符串值的开头支持特殊字符。

我目前有这样的表达方式:

/^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*()_+])[A-Za-z\d][A-Za-z\d!@#$%^&*()_+.]{7,63}$/

这接受8-64个字符之间的任何字符串,其中包含至少1个数字,字母和以下特殊符号:!@#$%^& *()_ +。

如何让它识别输入值开头的特殊字符?

要匹配的字符串:

.abc@1234
*abc@1234
abc@1234.
a@b.c1234

谢谢

1 个答案:

答案 0 :(得分:2)

您需要删除[A-Za-z\d]并将{7,63}替换为{8,64}

使用

^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*()_+])[A-Za-z\d!@#$%^&*()_+.]{8,64}$

请参阅demo

也许,您还想将.添加回前瞻,以便它也是必需的:

^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*()_+.])[A-Za-z\d!@#$%^&*()_+.]{8,64}$
                                         ^

要确保特殊符号不会立即发生,请添加(?!.*[!@#$%^&*()_+.]{2}) 否定前瞻

^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*()_+.])(?!.*[!@#$%^&*()_+.]{2})[A-Za-z\d!@#$%^&*()_+.]{8,64}$
                                            ^^^^^^^^^^^^^^^^^^^^^^^^

请参阅this demo

请注意,这里的很多人都会对使用如此长的正则表达式的可维护性问题尖叫。您可以将条件拆分为单独的代码段,也可以使用带注释的多行正则表达式:

var rx = RegExp("^" + // Start of string
               "(?=.*[a-zA-Z])" + // Require a letter
               "(?=.*\\d)" + // Require a digit
               "(?=.*[!@#$%^&*()_+])" + // Require a special symbol
               "(?!.*[!@#$%^&*()_+.]{2})" + // Disallow consecutive special symbols
               "[A-Za-z\\d!@#$%^&*()_+.]{8,64}" + // 8 to 64 symbols from the set
               "$");



var re = RegExp("^" + // Start of string
               "(?=.*[a-zA-Z])" + // Require a letter
               "(?=.*\\d)" + // Require a digit
               "(?=.*[!@#$%^&*()_+])" + // Require a special symbol
               "(?!.*[!@#$%^&*()_+.]{2})" + // Disallow consecutive special symbols
               "[A-Za-z\\d!@#$%^&*()_+.]{8,64}" + // 8 to 64 symbols from the set
               "$", "gm");

var str = '.abc@1234\n*abc@1234\nabc@1234.\na@b.c1234\n*abc@1234\nabc@1234.\na@b.c1234\na@b.#c123\na@__c1234';
while ((m = re.exec(str)) !== null) {
  document.body.innerHTML += m[0] + "<br/>";
}
&#13;
&#13;
&#13;