向regex添加条件以仅匹配ASCII字符

时间:2015-04-01 03:05:29

标签: regex

我有这个正则表达式:

/^(?=.*[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"

2 个答案:

答案 0 :(得分:1)

在匹配每个非空格字符之前,使用正向前瞻来检查ASCII字符。

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?:(?=\p{ASCII})\S){8,128}$

OR

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?:(?=[[:ascii:]])\S){8,128}$

DEMO

答案 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

sed 怎么说:https://www.gnu.org/software/sed/manual/html_node/Locale-Considerations.html#Multibyte-regexp-character-classes

grep 怎么说:https://www.gnu.org/software/grep/manual/grep.html#Character-Encoding

另一方面,“[[:ascii:]]”字符集甚至在许多正则表达式实现中都不存在。那么最便携的方法是在计算正则表达式之前将 LC_CTYPE 环境变量设置为“C”。然后你可以使用你的第一个正则表达式:

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)\S{7,127}.+$/