正则多字符串匹配问题:自定义Pattern匹配多逗号分隔值失败如何解决
问题原因
你编写的正则逻辑仅支持匹配恰好2个逗号分隔字段的输入,和空格无关。String.matches()方法要求正则完全匹配整个输入字符串,你原有正则被|分为两部分:
- 第一部分:
Pattern.quote(value) + ", [NnoneOoff0-9\\-\\+\\/]+"仅匹配「目标值在前、1个合法字段在后」的双字段结构 - 第二部分:
[NnoneOoff0-9\\-\\+\\/]+, " + Pattern.quote(value)仅匹配「1个合法字段在前、目标值在后」的双字段结构
当输入包含3个及以上字段时,字符串长度和结构完全超出正则匹配范围,自然返回false。
正确正则实现
如果你的需求是:匹配任意多逗号分隔的字段、所有字段仅允许出现N/n/o/n/e/O/f/f、数字、+、-、/字符、且至少包含一个目标value,可以用如下写法:
String regex = "^(?:[NnoneOoff0-9+\\/\\-]+, )*" + Pattern.quote(value) + "(?:, [NnoneOoff0-9+\\/\\-]+)*$";
正则逻辑说明
^、$分别匹配字符串的开头和结尾,确保整串完全匹配(?:[NnoneOoff0-9+\\/\\-]+, )*匹配0个或多个位于目标值之前的合法字段+,分隔符,非捕获组不会额外占用分组资源Pattern.quote(value)原样匹配目标值,避免目标值中的特殊字符被正则转义(?:, [NnoneOoff0-9+\\/\\-]+)*匹配0个或多个位于目标值之后的,+合法字段
适配场景验证
- 双字段场景(你的用例1):匹配成功,符合预期
- 三字段及以上场景(你的用例2):匹配成功
- 目标值在任意位置(开头、中间、结尾):均匹配成功
- 仅存在目标值一个字段:也可以匹配,如果你不需要支持这种场景,可根据需求调整前后量词为
+
内容的提问来源于stack exchange,提问作者Abinash Dash
相关产品推荐
相关产品推荐

