我正在为输入字段编写验证逻辑,只有字母数字字符,撇号'和连字符是允许的
public class SearchFilter implements Serializable {
@Pattern(regexp = "^[A-Za-z0-9'-]+$", message = "searchText should only contain alphanumeric values and ' and -")
private String searchText;
}
它是一个Spring启动应用程序,因此,在控制器方法中,使用
触发验证public List<Result> search(@Valid SearchFilter filter) {
//return searchService.search(filter);
}
它适用于大多数情况并且抛出验证错误但是出于理由&amp;允许使用&符号。我不知道为什么。在线正则表达式评估器
https://www.freeformatter.com/java-regex-tester.html
工作正常,即&amp;是不允许的。
知道为什么吗?我正在使用带有Spring Boot 4.3的java 8
更新
根据Andreas Lundgren的回应,将正则表达式更新为
@Pattern(regexp = "^[\\x2DA-Za-z0-9\\x27]+$", message = "searchText
should only contain alphanumeric values and ' and -")
对于&amp ;.的Spring验证仍然失败。我用Pattern类运行了一个测试,所有的都按预期工作,字符串带&amp;或者除了&#39;之外的任何其他特殊字符。而且 - 失败了
java.util.regex.Pattern p = java.util.regex.Pattern.compile("^[\\x2DA-Za-z0-9\\x27]+$");
Matcher m = p.matcher("Hello^s");
boolean b = m.matches();
System.out.println(b);
答案 0 :(得分:0)
我认为这是因为字符类中的-
用于描述reg exp中的跨度,因此它是字符类中的特殊字符,必须进行转义。
测试"^[A-Za-z0-9'\\-]+$"
在字符类中使用连字符并不意味着字符类包含字符-
,这意味着字符类包括连字符字符前后字符之间的ascii表中的所有字符。比较你写a-z
的方式。
如果你把它作为最后一个角色,不确定会发生什么......也许不同的引擎对此有不同的反应。示例'-,
是ascii表中'
(0x27)和,
(0x2C)之间的所有字符,例如+
(0x2B)。
答案 1 :(得分:0)
全部
从我的角度来看这是一个愚蠢的错误。该错误仅在通过POSTMAN调用时发生,并且意识到&是POSTMAN中的查询参数定界符,因此字符'&'未被传递给控制器。如果我们在POSTMAN中传递%26,则将&读取为字符,并且验证成功,并引发400错误。这不是正则表达式问题。感谢您的帮助