Spring Validation Regex允许使用&符号

时间:2018-06-18 20:41:51

标签: regex spring validation spring-boot

我正在为输入字段编写验证逻辑,只有字母数字字符,撇号'和连字符是允许的

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);

2 个答案:

答案 0 :(得分:0)

我认为这是因为字符类中的-用于描述reg exp中的跨度,因此它是字符类中的特殊字符,必须进行转义。

测试"^[A-Za-z0-9'\\-]+$"

在字符类中使用连字符并不意味着字符类包含字符-,这意味着字符类包括连字符字符前后字符之间的ascii表中的所有字符。比较你写a-z的方式。

如果你把它作为最后一个角色,不确定会发生什么......也许不同的引擎对此有不同的反应。示例'-,是ascii表中'(0x27)和,(0x2C)之间的所有字符,例如+(0x2B)。

答案 1 :(得分:0)

全部

从我的角度来看这是一个愚蠢的错误。该错误仅在通过POSTMAN调用时发生,并且意识到&是POSTMAN中的查询参数定界符,因此字符'&'未被传递给控制器​​。如果我们在POSTMAN中传递%26,则将&读取为字符,并且验证成功,并引发400错误。这不是正则表达式问题。感谢您的帮助