我有这个正则表达式:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)\S{7,127}.+$/
(至少一个大写,一个小写,一个数字,没有空格,len 8到128)
我想添加一个新条件:只有ASCII字符
目前我正在尝试:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(^\p{ASCII})\S{7,128}.+$/
适用于(不匹配):"çko#1!RtsdsWs"
但会匹配(由于ç
我想不匹配):"kço#1!RtsdsWs"
答案 0 :(得分:1)
在匹配每个非空格字符之前,使用正向前瞻来检查ASCII字符。
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?:(?=\p{ASCII})\S){8,128}$
OR
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?:(?=[[:ascii:]])\S){8,128}$
答案 1 :(得分:0)
它没有很好的文档记录,但几乎所有 POSIX 正则表达式实现都应该依赖于 LC_CTYPE 环境变量(它本身用于依赖于 LC_ALL 或 LANG 环境变量)。
POSIX 怎么说:https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05
glibc 中实现了什么:https://code.woboq.org/userspace/glibc/posix/regcomp.c.html
grep 怎么说:https://www.gnu.org/software/grep/manual/grep.html#Character-Encoding
另一方面,“[[:ascii:]]”字符集甚至在许多正则表达式实现中都不存在。那么最便携的方法是在计算正则表达式之前将 LC_CTYPE 环境变量设置为“C”。然后你可以使用你的第一个正则表达式:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)\S{7,127}.+$/