package org.apereo.cas.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Collection; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import java.util.stream.Collectors; /** * Utility class to assist with regex operations. * * @author Misagh Moayyed * @since 5.0.0 */ public final class RegexUtils { /** A pattern match that does not match anything. */ public static final Pattern MATCH_NOTHING_PATTERN = Pattern.compile("a^"); private static final Logger LOGGER = LoggerFactory.getLogger(RegexUtils.class); private RegexUtils() {} /** * Check to see if the specified pattern is a valid regular expression. * * @param pattern the pattern * @return whether this is a valid regex or not */ public static boolean isValidRegex(final String pattern) { try { if (pattern != null) { Pattern.compile(pattern); return true; } } catch (final PatternSyntaxException exception) { LOGGER.debug("Pattern [{}] is not a valid regex.", pattern); } return false; } /** * Creates the pattern. Matching is by default * case insensitive. * * @param pattern the pattern, may not be null. * @return the pattern or or {@link RegexUtils#MATCH_NOTHING_PATTERN} * if pattern is null or invalid. */ public static Pattern createPattern(final String pattern) { return createPattern(pattern, Pattern.CASE_INSENSITIVE); } /** * Concatenate all elements in the given collection to form a regex pattern. * * @param requiredValues the required values * @param caseInsensitive the case insensitive * @return the pattern */ public static Pattern concatenate(final Collection<String> requiredValues, final boolean caseInsensitive) { final String pattern = requiredValues.stream().collect(Collectors.joining("|", "(", ")")); return createPattern(pattern, caseInsensitive ? Pattern.CASE_INSENSITIVE : 0); } /** * Creates the pattern with the given flags. * * @param pattern the pattern, may be null. * @return the compiled pattern or {@link RegexUtils#MATCH_NOTHING_PATTERN} * if pattern is null or invalid. */ private static Pattern createPattern(final String pattern, final int flags) { if (pattern == null) { LOGGER.debug("Pattern [{}] can't be null", pattern); return MATCH_NOTHING_PATTERN; } try { return Pattern.compile(pattern, flags); } catch (final PatternSyntaxException exception) { LOGGER.debug("Pattern [{}] is not a valid regex.", pattern); return MATCH_NOTHING_PATTERN; } } }