blob: 30f6d2b21faae24ceda87e020291602cd83fe1a3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 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 API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.ui.util;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
/**
*
*/
public class PatternConstructor {
private PatternConstructor() {
// don't instantiate
}
/**
* Creates a pattern element from the pattern string which is either a reg-ex expression or in our old
* 'StringMatcher' format.
* @param pattern The search pattern
* @param isCaseSensitive Set to <code>true</code> to create a case insensitive pattern
* @param isRegexSearch <code>true</code> if the passed string already is a reg-ex pattern
* @return The created pattern
* @throws PatternSyntaxException
*/
public static Pattern createPattern(String pattern, boolean isCaseSensitive, boolean isRegexSearch) throws PatternSyntaxException {
if (!isRegexSearch) {
pattern= asRegEx(pattern, new StringBuffer()).toString();
}
if (!isCaseSensitive)
return Pattern.compile(pattern, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE | Pattern.MULTILINE);
return Pattern.compile(pattern, Pattern.MULTILINE);
}
/**
* Creates a pattern element from the pattern string which is either a reg-ex expression or in our old
* 'StringMatcher' format.
* @param patterns The search patterns
* @param isCaseSensitive Set to <code>true</code> to create a case insensitive pattern
* @param isRegexSearch <code>true</code> if the passed string already is a reg-ex pattern
* @return The created pattern
* @throws PatternSyntaxException
*/
public static Pattern createPattern(String[] patterns, boolean isCaseSensitive, boolean isRegexSearch) throws PatternSyntaxException {
StringBuffer pattern= new StringBuffer();
for (int i= 0; i < patterns.length; i++) {
if (i > 0) {
pattern.append('|');
}
if (isRegexSearch) {
pattern.append(patterns[i]);
} else {
asRegEx(patterns[i], pattern);
}
}
return createPattern(pattern.toString(), isCaseSensitive, true);
}
/**
* Translates a StringMatcher pattern (using '*' and '?') to a regex pattern string
* @param stringMatcherPattern a pattern using '*' and '?'
*/
private static StringBuffer asRegEx(String stringMatcherPattern, StringBuffer out) {
boolean escaped= false;
boolean quoting= false;
int i= 0;
while (i < stringMatcherPattern.length()) {
char ch= stringMatcherPattern.charAt(i++);
if (ch == '*' && !escaped) {
if (quoting) {
out.append("\\E"); //$NON-NLS-1$
quoting= false;
}
out.append(".*"); //$NON-NLS-1$
escaped= false;
continue;
} else if (ch == '?' && !escaped) {
if (quoting) {
out.append("\\E"); //$NON-NLS-1$
quoting= false;
}
out.append("."); //$NON-NLS-1$
escaped= false;
continue;
} else if (ch == '\\' && !escaped) {
escaped= true;
continue;
} else if (ch == '\\' && escaped) {
escaped= false;
if (quoting) {
out.append("\\E"); //$NON-NLS-1$
quoting= false;
}
out.append("\\\\"); //$NON-NLS-1$
continue;
}
if (!quoting) {
out.append("\\Q"); //$NON-NLS-1$
quoting= true;
}
if (escaped && ch != '*' && ch != '?' && ch != '\\')
out.append('\\');
out.append(ch);
escaped= ch == '\\';
}
if (quoting)
out.append("\\E"); //$NON-NLS-1$
return out;
}
}