Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java模式验证注释和util Regex模式的行为不同_Java_Regex_Validation - Fatal编程技术网

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]*$)(?!.*[/])"