正则表达式与Apache正则表达式

时间:2017-02-15 14:18:03

标签: javascript java regex

我遇到的情况是,相同的模式适用于Java而不适用于Apache常规experssions API。

import java.util.regex.*;
import org.apache.oro.text.regex.MalformedPatternException;
import org.apache.oro.text.regex.PatternCompiler;
import org.apache.oro.text.regex.PatternMatcher;
import org.apache.oro.text.regex.Perl5Compiler;
import org.apache.oro.text.regex.Perl5Matcher;

public class PatternExample {

    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9\\p{Punct}]+");  //working
        Matcher matcher = pattern.matcher("pass@1234");
        System.out.println("Input String matches regex - "+matcher.matches());
        match("pass@1234");
    }


    public static MatchResult match(String input) {
        PatternCompiler compiler = new Perl5Compiler();
        PatternMatcher matcher = new Perl5Matcher();
        org.apache.oro.text.regex.Pattern pattern = null;

        if (pattern == null) {
            try {
                pattern = compiler.compile("^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9\\p{Punct}]+");
            } catch (MalformedPatternException e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
                return null;
            }
        }
        if (matcher.matches(input, pattern)) {
            System.out.println("true");
        }else{
            System.out.println("false");
        }
        return null;
    }

}

上面的代码在main方法模式中以两种不同的方式给出输出,而match方法给出false。

基本上我的要求是允许在Java和JavaScript中使用字母数字和一些特殊字符,我在JavaScript中验证,再在Java中使用Perl5Compiler验证。

Javascript验证     function _validatePasswordCharacter(/ * Widget * / field){

    var regExp;
    var regExpInput = "^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9\\p{Punct}]+";
    console.log(regExpInput);
    try
    {
        regExp = new RegExp(regExpInput);
    }
    catch (Error)
    {
        console.debug('Error while parsing the password charset');

        return false;
    }

    if (!regExp.test(field.get('value')))
    {       
        console.debug('Password not matching regular expression check -- portal.properties');
        return false;
    } 
    else{
        console.debug('Password matching regular expression check -- portal.properties');
        return true;
    }

}

请建议继续前进

1 个答案:

答案 0 :(得分:0)

经过一些测试后我认为Perl没有{Punct}类这个正则表达式应该按预期工作:

"^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9!"#$%&'()*+,./:;<=>?@[\]^_ {|}〜 - ] +&#34;`