//------------------------------------------------------------------------------ // Copyright (c) 2005, 2006 IBM Corporation and others. // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // which accompanies this distribution, and is available at // http://www.eclipse.org/legal/epl-v10.html // // Contributors: // IBM Corporation - initial implementation //------------------------------------------------------------------------------ package org.eclipse.epf.search.ui.internal; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; /** * Pattern contructor for a method search. * * @author Kelvin Low * @since 1.0 */ public class MethodSearchPattern { /** * Private constructor to prevent this class from being instantiated. All * methods in this class should be static. */ private MethodSearchPattern() { } /** * Creates a * <code>Pattern<code> object from the pattern string used in Method Search. * * @param pattern * a search pattern string * @param isCaseSensitive * if <code>true</code>, create a case insensitve pattern * @param isRegexSearch * if <code>true</code>, treat the pattern as a regular expression pattern * @return a new <code>Pattern<code> object * @throws <code>PatternSyntaxException</code> if the specified pattern has a syntax error */ public static Pattern createPattern(String pattern, boolean isCaseSensitive, boolean isRegexSearch) throws PatternSyntaxException { if (!isRegexSearch) { pattern = toRegexPattern(pattern); } if (!isCaseSensitive) { return Pattern.compile(pattern, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE | Pattern.MULTILINE); } return Pattern.compile(pattern, Pattern.MULTILINE); } /** * Converts a pattern string with '*' and '?' into a regular expression * pattern string. * * @param pattern * a pattern string * @return a regular expression pattern string */ private static String toRegexPattern(String pattern) { int patternLength = pattern.length(); StringBuffer result = new StringBuffer(patternLength); boolean escaped = false; boolean quoting = false; for (int i = 0; i < patternLength; i++) { char ch = pattern.charAt(i); switch (ch) { case '*': if (!escaped) { if (quoting) { result.append("\\E"); //$NON-NLS-1$ quoting = false; } } result.append(".*"); //$NON-NLS-1$ escaped = false; break; case '?': if (!escaped) { if (quoting) { result.append("\\E"); //$NON-NLS-1$ quoting = false; } } result.append("."); //$NON-NLS-1$ escaped = false; break; case '\\': if (!escaped) { escaped = true; } else { escaped = false; if (quoting) { result.append("\\E"); //$NON-NLS-1$ quoting = false; } result.append("\\\\"); //$NON-NLS-1$ } break; default: if (!quoting) { result.append("\\Q"); //$NON-NLS-1$ quoting = true; } if (escaped && ch != '*' && ch != '?' && ch != '\\') { result.append('\\'); } result.append(ch); escaped = (ch == '\\'); } } if (quoting) { result.append("\\E"); //$NON-NLS-1$ } return result.toString(); } }