我正在尝试验证用户输入的字符串,以用作信用卡对帐单上用于描述购买的对帐单说明。
要求是:
这是我到目前为止所能做的,这是一种的工作方式:
/^(?=.*?[a-zA-Z])[a-zA-Z0-9]{5,22}$/gm
...因为它可以正确检查5-22个字符的长度,并检查至少一个字母。但是,它不允许所有特殊字符和变音符号,而不是不允许的少数特殊字符和变音符号。如何修改它以允许其他允许的字符?
答案 0 :(得分:3)
您可以使用正向前瞻性来断言一个字符,并使用负向前瞻性断言不匹配字符类中列出的任何字符。
对于Javascript,您可以使用不区分大小写的标志/i
并使用[a-z]
。
编辑:正如Wiktor Stribiżew所指出的,要仅匹配ASCII字符,可以使用[\x00-\x7F]
而不是点。
^(?=.*[a-z])(?!.*[<>\\'"])[\x00-\x7F]{5,22}$
^
字符串的开头(?=.*[a-z])
前瞻,以检查是否存在ASCII字母(?!.*[<>\\'"])
负向查找以检查字符类中是否没有任何字符[\x00-\x7F]{5,22}
匹配任何ASCII字符5-22次$
字符串的结尾例如:
const regex = /^(?=.*[a-z])(?!.*[<>\\'"])[\x00-\x7F]{5,22}$/gmi;
请参见regex demo
答案 1 :(得分:2)
您可以使用
/^(?=[^a-z]*[a-z])(?:(?![<>\\'"])[\x00-\x7F]){5,22}$/i
/^(?=[^a-z]*[a-z])(?![^<>\\'"]*[<>\\'"])[\x00-\x7F]{5,22}$/i
如果您的意思是允许使用可打印的ASCII字符
/^(?=[^a-z]*[a-z])(?:(?![<>\\'"])[ -~]){5,22}$/i
/^(?=[^a-z]*[a-z])(?![^<>\\'"]*[<>\\'"])[ -~]{5,22}$/i
详细信息
^
-字符串的开头(?=[^a-z]*[a-z])
-字符串中至少应包含1个ASCII字母(?:(?![<>\\'"])[ -~]){5,22}
-除<
,>
,\
,'
和{{1}以外的任何可打印ASCII字符出现五至二十二次}(如果使用"
,则除否定字符类中的字符外的任何ASCII字符)[\x00-\x7F]
-字符串中不允许使用(?![^<>\\'"]*[<>\\'"])
,<
,>
,\
和'
"
-字符串的结尾。