Regex Spring验证正则表达式允许使用符号AND

Regex Spring验证正则表达式允许使用符号AND,regex,spring,validation,spring-boot,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 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);
    }
对于&,Spring验证仍然失败。我用Pattern类运行了一个测试,所有测试都按预期进行,带&或除“and-”之外的任何其他特殊字符的字符串都失败了

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

我认为这是因为character类中的
-
用于描述reg exp中的span,因此它是character类中的特殊字符,必须转义

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

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

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

全部


这是我这边的一个愚蠢的错误。该错误仅在通过POSTMAN调用时发生,并意识到&是POSTMAN中的查询参数定界符,因此字符“&”没有传递给控制器。如果我们在POSTMAN中通过了%26,&将被读取为字符,验证成功并抛出400错误。这不是一个正则表达式问题。感谢所有帮助

以确保:does
是否也通过?尝试将
'
替换为
\x27
(应该是字符串文本中的
\\x27
。@WiktorStribiżew感谢您的回复。是的,它也拒绝分号。问题在于&仅此而已。将撇号替换为\x27如果正则表达式引擎是Lucene,请尝试使用
“[-A-Za-z0-9']+”
连字符工作正常,无论我是否转义它。问题是&虽然我没有在regex中添加这一点,但在字符类中使用连字符并不意味着字符类包含字符
-
,它意味着字符类包含ascii表中连字符前后字符之间的所有字符。我将澄清我的答案。我在第一个索引和最后一个索引中都添加了连字符的转义十六进制,但问题是相同的。这对于java.util.regex.Pattern测试来说运行良好,请检查我的更新。Spring对@Pattern的实现可能有问题
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);