/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.uberfire.commons.regex.util; import static org.uberfire.commons.validation.PortablePreconditions.checkNotNull; /** * GlobToRegEx utility class for glob patterns. * <p> * This code has been borrowed and then adapted from <a href="http://http://jakarta.apache.org/oro/">Jakarta ORO</a>. * <p> */ public final class GlobToRegEx { private GlobToRegEx() { } public static String globToRegex(final String glob) { checkNotNull("glob", glob); boolean inCharSet = false; final StringBuilder buffer = new StringBuilder(2 * glob.length()); final char[] pattern = glob.toCharArray(); int ch; for (ch = 0; ch < pattern.length; ch++) { switch (pattern[ch]) { case '*': if (inCharSet) { buffer.append('*'); } else { buffer.append(".*"); } break; case '?': if (inCharSet) { buffer.append('?'); } else { buffer.append(".?"); } break; case '[': inCharSet = true; buffer.append(pattern[ch]); if (ch + 1 < pattern.length) { switch (pattern[ch + 1]) { case '!': case '^': buffer.append('^'); ++ch; continue; case ']': buffer.append(']'); ++ch; continue; } } break; case ']': inCharSet = false; buffer.append(pattern[ch]); break; case '\\': buffer.append('\\'); if (ch == pattern.length - 1) { buffer.append('\\'); } else if (__isGlobMetaCharacter(pattern[ch + 1])) { buffer.append(pattern[++ch]); } else { buffer.append('\\'); } break; default: if (!inCharSet && __isRegExMetaCharacter(pattern[ch])) { buffer.append('\\'); } buffer.append(pattern[ch]); break; } } return buffer.toString(); } private static boolean __isRegExMetaCharacter(char ch) { return ("'*?+[]()|^$.{}\\".indexOf(ch) >= 0); } private static boolean __isGlobMetaCharacter(char ch) { return ("*?[]".indexOf(ch) >= 0); } }