如何用正则匹配特定模式并排除子串?新西兰地址验证需求
新西兰地址验证的HTML5正则表达式方案
最终正则表达式(支持HTML5表单验证)
^(?![\s\S]*(?:p\s*o\s*b\s*o\s*x|p\s*r\s*i\s*v\s*a\s*t\s*e\s*b\s*a\s*g))\d[\p{L}\d\s\/\,\'\-\u0101\u0113\u012B\u014D\u016B]*$
附加标志:i(不区分大小写匹配)
正则拆解说明
^:锁定字符串起始位置(?![\s\S]*(?:p\s*o\s*b\s*o\s*x|p\s*r\s*i\s*v\s*a\s*t\s*e\s*b\s*a\s*g)):负向前瞻规则,确保地址中不存在任意大小写、任意空格组合的PO Box(如pobox、PO BOX、P O B O X)或Private Bag(如privatebag、PRIVATEBAG)\d:强制地址必须以数字开头[\p{L}\d\s\/\,\'\-\u0101\u0113\u012B\u014D\u016B]*:匹配后续所有允许的字符:\p{L}:匹配任意Unicode字母(覆盖英语及毛利语基础字母)\d:数字\s:空格\/、\,、\'、\-:斜杠、逗号、单引号、连字符\u0101\u0113\u012B\u014D\u016B:明确匹配毛利语带重音的元音(ā、ē、ī、ō、ū)
$:锁定字符串结束位置
HTML5表单直接使用示例
把正则放到input标签的pattern属性中,配合title提示错误信息:
<input type="text" pattern="^(?![\s\S]*(?:p\s*o\s*b\s*o\s*x|p\s*r\s*i\s*v\s*a\s*t\s*e\s*b\s*a\s*g))\d[\p{L}\d\s\/\,\'\-\u0101\u0113\u012B\u014D\u016B]*$" title="请输入有效的新西兰地址:需以数字开头,不能包含PO Box/Private Bag相关内容,仅允许字母、数字、空格、/-,'及毛利语带重音元音" required >
浏览器会自动处理验证逻辑,无需额外编写JavaScript判断。
兼容旧浏览器的替代方案
如果需要兼容不支持Unicode属性转义(\p{L})的旧浏览器,可以将字符类替换为明确枚举的形式:
^(?![\s\S]*(?:p\s*o\s*b\s*o\s*x|p\s*r\s*i\s*v\s*a\s*t\s*e\s*b\s*a\s*g))\d[A-Za-zĀāĒēĪīŌōŪū\d\s\/\,\'\-\u0101\u0113\u012B\u014D\u016B]*$
内容的提问来源于stack exchange,提问作者Jeremy Leys
相关产品推荐
相关产品推荐

