// ============================================================================ // // Copyright (C) 2006-2016 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package org.talend.dataquality.email.CommonCheck; import java.io.Serializable; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * created by talend on 2014年12月30日 Detailled comment * */ public class RegexValidator implements Serializable { private static final long serialVersionUID = -8832409930574867162L; private final Pattern[] patterns; /** * Construct a <i>case sensitive</i> validator for a single regular expression. * * @param regex The regular expression this validator will validate against */ public RegexValidator(String regex) { this(regex, true); } /** * Construct a validator for a single regular expression with the specified case sensitivity. * * @param regex The regular expression this validator will validate against * @param caseSensitive when <code>true</code> matching is <i>case sensitive</i>, otherwise matching is <i>case * in-sensitive</i> */ public RegexValidator(String regex, boolean caseSensitive) { this(new String[] { regex }, caseSensitive); } /** * Construct a <i>case sensitive</i> validator that matches any one of the set of regular expressions. * * @param regexs The set of regular expressions this validator will validate against */ public RegexValidator(String[] regexs) { this(regexs, true); } /** * Construct a validator that matches any one of the set of regular expressions with the specified case sensitivity. * * @param regexs The set of regular expressions this validator will validate against * @param caseSensitive when <code>true</code> matching is <i>case sensitive</i>, otherwise matching is <i>case * in-sensitive</i> */ public RegexValidator(String[] regexs, boolean caseSensitive) { if (regexs == null || regexs.length == 0) { throw new IllegalArgumentException("Regular expressions are missing"); } patterns = new Pattern[regexs.length]; int flags = caseSensitive ? 0 : Pattern.CASE_INSENSITIVE; for (int i = 0; i < regexs.length; i++) { if (regexs[i] == null || regexs[i].length() == 0) { throw new IllegalArgumentException("Regular expression[" + i + "] is missing"); } patterns[i] = Pattern.compile(regexs[i], flags); } } /** * Validate a value against the set of regular expressions. * * @param value The value to validate. * @return <code>true</code> if the value is valid otherwise <code>false</code>. */ public boolean isValid(String value) { if (value == null) { return false; } for (Pattern pattern : patterns) { if (pattern.matcher(value).matches()) { return true; } } return false; } /** * Validate a value against the set of regular expressions returning the array of matched groups. * * @param value The value to validate. * @return String array of the <i>groups</i> matched if valid or <code>null</code> if invalid */ public String[] match(String value) { if (value == null) { return new String[0]; } for (Pattern pattern : patterns) { Matcher matcher = pattern.matcher(value); if (matcher.matches()) { int count = matcher.groupCount(); String[] groups = new String[count]; for (int j = 0; j < count; j++) { groups[j] = matcher.group(j + 1); } return groups; } } return new String[0]; } /** * Validate a value against the set of regular expressions returning a String value of the aggregated groups. * * @param value The value to validate. * @return Aggregated String value comprised of the <i>groups</i> matched if valid or <code>null</code> if invalid */ public String validate(String value) { if (value == null) { return null; } for (Pattern pattern : patterns) { Matcher matcher = pattern.matcher(value); if (matcher.matches()) { int count = matcher.groupCount(); if (count == 1) { return matcher.group(1); } StringBuilder buffer = new StringBuilder(); for (int j = 0; j < count; j++) { String component = matcher.group(j + 1); if (component != null) { buffer.append(component); } } return buffer.toString(); } } return null; } /** * Provide a String representation of this validator. * * @return A String representation of this validator */ @Override public String toString() { StringBuilder buffer = new StringBuilder(); buffer.append("RegexValidator{"); for (int i = 0; i < patterns.length; i++) { if (i > 0) { buffer.append(","); } buffer.append(patterns[i].pattern()); } buffer.append("}"); return buffer.toString(); } }