fix bug with some special chars

This commit is contained in:
Sebastian Sdorra
2014-03-09 14:20:43 +01:00
parent c133464cdf
commit 9b7bc96282
2 changed files with 100 additions and 6 deletions

View File

@@ -35,6 +35,9 @@ package sonia.scm.search;
//~--- non-JDK imports --------------------------------------------------------
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.TransformFilter;
import sonia.scm.util.Util;
@@ -45,7 +48,6 @@ import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.regex.Pattern;
/**
*
@@ -54,6 +56,14 @@ import java.util.regex.Pattern;
public final class SearchUtil
{
/**
* the logger for SearchUtil
*/
private static final Logger logger =
LoggerFactory.getLogger(SearchUtil.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
@@ -181,6 +191,77 @@ public final class SearchUtil
return items;
}
/**
* Method description
*
*
* @param pattern
* @param c
*/
private static void appendChar(StringBuilder pattern, char c)
{
switch (c)
{
case '*' :
pattern.append(".*");
break;
case '?' :
pattern.append(".");
break;
case '(' :
pattern.append("\\(");
break;
case ')' :
pattern.append("\\)");
break;
case '{' :
pattern.append("\\{");
break;
case '}' :
pattern.append("\\}");
break;
case '[' :
pattern.append("\\[");
break;
case ']' :
pattern.append("\\]");
break;
case '|' :
pattern.append("\\|");
break;
case '.' :
pattern.append("\\.");
break;
case '\\' :
pattern.append("\\\\");
break;
default :
pattern.append(c);
}
}
/**
* Method description
*
@@ -193,19 +274,26 @@ public final class SearchUtil
{
String query = request.getQuery().trim();
StringBuilder pattern = new StringBuilder();
if (request.isIgnoreCase())
{
pattern.append("(?i)");
query = query.toLowerCase(Locale.ENGLISH);
}
query = query.replace("\\", "\\\\").replace("*", ".*").replace("?", ".");
query = ".*".concat(query).concat(".*");
pattern.append(".*");
if (request.isIgnoreCase())
for (char c : query.toCharArray())
{
query = "(?i)".concat(query);
appendChar(pattern, c);
}
return query;
pattern.append(".*");
logger.trace("converted query \"{}\" to regex pattern \"{}\"",
request.getQuery(), pattern);
return pattern.toString();
}
}

View File

@@ -177,6 +177,12 @@ public class SearchUtilTest
"testhansolo"));
assertFalse(SearchUtil.matchesAll(new SearchRequest("test\\hansolo"),
"test\\hnsolo"));
assertTrue(SearchUtil.matchesAll(new SearchRequest("{test,hansolo} tst"),
"{test,hansolo} tst"));
assertTrue(SearchUtil.matchesAll(new SearchRequest("(test,hansolo) tst"),
"(test,hansolo) tst"));
assertTrue(SearchUtil.matchesAll(new SearchRequest("[test,hansolo] tst"),
"[test,hansolo] tst"));
}
/**