我遇到的情况是,相同的模式适用于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;
}
}
请建议继续前进
答案 0 :(得分:0)
经过一些测试后我认为Perl没有{Punct}类这个正则表达式应该按预期工作:
"^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9!"#$%&'()*+,./:;<=>?@[\]^_
{|}〜 - ] +&#34;`