@Pattern正则限制文本以[开头校验遇换行符失效问题
正则失效原因
- 最初使用的
@Pattern("^\[")逻辑完全反向:该规则的作用是匹配以[开头的内容,和“禁止以[开头”的校验目标相悖,自然无法满足要求。 - 后续使用的
^(?!\[).*在含换行场景失效的核心原因是:Java正则默认规则下,.通配符不会匹配换行符\n,只要文本中存在换行,.*就只能匹配到第一行末尾,匹配逻辑中断,负向预查的校验规则就会失效。另外注意Java字符串中书写正则转义符时,反斜杠需要二次转义,即匹配[的正则片段要写为\\[,直接写\[会存在Java字符串转义问题。
适配换行场景的可行方案
两种方案都可以满足校验要求,按需选择即可:
方案1:开启DOTALL模式让.支持匹配换行
直接在正则前加行内模式标记(?s)开启DOTALL模式,该模式下.可以匹配包括换行符在内的所有字符,完整代码如下:
public final static String FREE_TEXT_FIELD_VALIDATION_PATTERN = "(?s)^(?!\\[).*"; @Pattern(regexp = FREE_TEXT_FIELD_VALIDATION_PATTERN, message = FREE_TEXT_FIELD_VALIDATION_ERROR) public String ruleDescription;
方案2:用全字符匹配组替代.,无需修改匹配模式
如果不想调整正则匹配模式,可以用[\s\S](匹配所有空白字符+所有非空白字符,天然覆盖换行符)替代.,正则写法如下:
public final static String FREE_TEXT_FIELD_VALIDATION_PATTERN = "^(?!\\[)[\\s\\S]*";
规则校验效果验证
上述两种方案都可以完全匹配预期校验逻辑,对应测试用例结果如下:
- 输入
Welcome[Hello:首字符不是[,校验通过 - 输入
Welcome[:首字符不是[,校验通过 - 输入
[Welcome:首字符是[,校验不通过 - 输入单个空格:首字符为空格不是
[,校验通过 - 输入包含任意数量换行符的文本:只要首字符不是
[就校验通过,首字符为[则直接拦截,无兼容问题。
内容的提问来源于stack exchange,提问作者Anand Kumar
相关产品推荐
相关产品推荐

