Java模式验证注释和util Regex模式的行为不同
我有一个正则表达式Java模式验证注释和util Regex模式的行为不同,java,regex,validation,Java,Regex,Validation,我有一个正则表达式 ^(?=[a-zA-Z0-9,!@#$&*()_'+-=<>.?{}\\[\\]|; :\\s]*$)(?!.*[/]) ^(?=[a-zA-Z0-9,!@$&*()(?!+-=.?{}\\[\]\]:\\s]*$)(?!.*[/])) 我通过两种方法尝试了正则表达式,用于字符串“hello”: java.util.regex.Pattern:将通过测试 javax.validation.constraints.Pattern(注释):将抛出一个错误,
^(?=[a-zA-Z0-9,!@#$&*()_'+-=<>.?{}\\[\\]|; :\\s]*$)(?!.*[/])
^(?=[a-zA-Z0-9,!@$&*()(?!+-=.?{}\\[\]\]:\\s]*$)(?!.*[/]))
我通过两种方法尝试了正则表达式,用于字符串“hello”
:
java.util.regex.Pattern
:将通过测试javax.validation.constraints.Pattern
(注释):将抛出一个错误,指出存在无效值有人知道为什么这两个正则表达式的行为不同吗?至少对于给定的测试字符串“hello”,似乎这两个正则表达式的行为是相同的,因此如果没有进一步的信息,很难知道您遇到了什么 这个简短的程序测试了这两个方面。下面给出了示例输出
public class RegexTest {
static final String REGEX = "^(?=[a-zA-Z0-9,!@#$&*()_'+-=<>.?{}\\[\\]|; :\\s]*$)(?!.*[/])";
static final String TEST = "hello";
public static class TestObject {
@javax.validation.constraints.Pattern(regexp=REGEX)
String name;
}
public static void main(String[] args) {
test1();
test2();
}
public static void test1() {
java.util.regex.Pattern p = java.util.regex.Pattern.compile(REGEX);
Matcher m = p.matcher(TEST);
System.out.println(m.matches()); // false, ie, doesn't match
}
public static void test2() {
TestObject to = new TestObject();
to.name = TEST;
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<TestObject>> violations = validator.validate(to);
for(ConstraintViolation<TestObject> violation : violations) {
System.out.println(violation.getMessage()); // One violation, "must match"
}
}
}
公共类RegexTest{
静态最终字符串REGEX=“^(?=[a-zA-Z0-9,!@#$&*()'+-=.?{}\\[\]\\]|:\\s]*$)(?!!.[/]);
静态最终字符串测试=“hello”;
公共静态类TestObject{
@javax.validation.constraints.Pattern(regexp=REGEX)
字符串名;
}
公共静态void main(字符串[]args){
test1();
test2();
}
公共静态void test1(){
java.util.regex.Pattern p=java.util.regex.Pattern.compile(regex);
匹配器m=p.匹配器(测试);
System.out.println(m.matches());//false,即不匹配
}
公共静态void test2(){
TestObject to=新的TestObject();
to.name=测试;
ValidatorFactory=Validation.buildDefaultValidatorFactory();
Validator Validator=factory.getValidator();
设置冲突=validator.validate(to);
for(约束冲突:冲突){
System.out.println(违例。getMessage());//一个违例,“必须匹配”
}
}
}
false
INFO o.h.validator.internal.util.Version-HV000001:Hibernate validator 5.2.4.Final
必须匹配“^(?=[a-zA-Z0-9,!@$&*(),!+-=.?{}\[\].\:\s]*$)(?!.[/])”
无论如何,内部的-
必须转义或放在[…]
字符类的末尾。该表达式看起来有点奇怪,例如,前瞻中的巨大字符类似乎允许除正斜杠以外的几乎任何ascii字符。如果您的输入只能是ascii码,那么[^/]
难道不更容易阅读吗(前提是输入不能以斜杠开头)?@maraca注释是使用字符串配置的,因此您也需要在那里进行双转义。您能不能同时发布如何使用java.util.regex.Pattern
进行测试?我对javax.validation不太熟悉,但我猜它需要输入通过matches()
,如果您在其他测试中没有使用它,这可能就是您的差异的原因。您可能还想告诉我们您的正则表达式应该匹配和不应该匹配什么-我强烈感觉它太复杂了(尽管我可能错了)。可以缩短为:^[!\$&-.0-\[\]\u a-}\\s]*$
false
INFO o.h.validator.internal.util.Version - HV000001: Hibernate Validator 5.2.4.Final
must match "^(?=[a-zA-Z0-9,!@#$&*()_'+-=<>.?{}\[\]|; :\s]*$)(?!.*[/])"