如何编写允许1-25个字母/空格且排除指定3字母值的RegEx
问题原因
你写的正则失效核心有两个问题:
- 没有添加字符串起始锚点
^,正则不会强制从输入的第一个字符开始匹配,遇到EMP这类禁用词时,会自动从第二个字符开始匹配剩余的MP内容,导致校验绕过。 - 负向前瞻的校验范围错误,原写法仅校验了匹配起始位置的字符序列,没有针对整个输入的完整匹配结果做禁用判断。
你之前写的固定长度为3的正则能正常运行,是因为长度限制刚好等于禁用词的长度,没有起始锚点也只能匹配整个输入串,负向前瞻刚好能覆盖完整校验逻辑,所以不会出现偏移绕过的问题。
解决方案
根据你的实际校验规则可以二选一:
场景1:仅禁止输入完全等于EMP/NDB/POI/CWR(包含禁用词作为子串的内容允许,比如EMPLOYEE、A NDB B都可通过)
^(?!(?:EMP|NDB|POI|CWR)$)[A-Za-z\s]{1,25}$
规则说明:
^锚定输入起始位置,要求必须从第一个字符开始匹配(?!(?:EMP|NDB|POI|CWR)$)负向前瞻,直接排除整个输入刚好是四个禁用词之一的情况[A-Za-z\s]{1,25}匹配1到25个字母或空格$锚定输入结束位置,要求匹配到最后一个字符为止
场景2:输入中完全不能出现EMP/NDB/POI/CWR子串(只要包含就禁止,比如EMPLOYEE、XPOIY都无法通过)
^(?!.*(?:EMP|NDB|POI|CWR))[A-Za-z\s]{1,25}$
规则说明:
和场景1唯一的区别是负向前瞻(?!.*(?:EMP|NDB|POI|CWR))会扫描整个输入的所有位置,只要任意位置出现禁用词就直接匹配失败。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

