我有一个要求,我需要根据过滤器中提供的数据匹配并列出一些对象 用户也可以输入匹配的正则表达式。
例如:
正如我所拥有的字符串列表:"test","detest","test0/1/1"
过滤1 :
"te"
--->打印列表中的所有元素
过滤2 :
"te*"
--->只打印“测试”,“厌恶”,而不是第三个元素。
我想匹配字符“/
”以及
我希望下面的过滤器也能给我一个匹配的结果:
te*0/*
*st*
到目前为止我尝试过的代码片段:
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class StringMatch {
static List<String> values = Arrays.asList("test","detest","test0/1/1");
public static Collection<String> query(String queryStr, List<String> values) {
String orgQueryStr = queryStr;
queryStr = queryStr.replaceAll("\\*", "\\\\w*");
queryStr = "\\w*" + queryStr + "\\w*";
System.out.println(queryStr);
List<String> list = new ArrayList<String>();
for (int i = 0; i < values.size(); i++) {
String str = values.get(i);
String str1 = str.toLowerCase();
//System.out.println("Search string : " + str1 + " QueryString : " + queryStr + " Original : " + orgQueryStr);
if (str1.matches(queryStr) || str1.contains(orgQueryStr)){
//System.out.println("Matched !!");
list.add(str);
}
else{
//System.out.println("Did not match " + str1);
}
}
if (list.isEmpty())
return null;
else
return list;
}
public static void main(String[] args) {
String queryStr = "te*";
System.out.println(URLDecoder.decode(queryStr));
queryStr = URLDecoder.decode(queryStr);
System.out.println(query(queryStr.toLowerCase(), values));
}
}
答案 0 :(得分:1)
\w
与/
不匹配,只与字母数字和下划线字符匹配。
通过查看您的代码,我相信您希望在过滤器中将任何字符与*
匹配。除换行符之外的任何字符都可以与.
匹配。
使用
queryStr= queryStr.replaceAll("\\*+", ".*");
queryStr = ".*" + queryStr + (queryStr.endsWith(".*") ? "" : ".*");
请参阅IDEONE demo
如果过滤器中的*
只能匹配任何字符而只有空格,请使用\S
代替.
:
queryStr= queryStr.replaceAll("\\*", "\\\\S*");
queryStr = "\\S*" + queryStr + (queryStr.endsWith("\\S*") ? "" : "\\S*");
答案 1 :(得分:0)
正斜杠&#34; /&#34;在您的搜索字符串中需要进行转义(因为它可以被视为特殊字符,因此不会被匹配)。所以基本上你需要修改你的表达式,如:
static List<String> values = Arrays.asList("test","detest","test\\/1\\/1");
编辑:添加了反斜杠的转义
答案 2 :(得分:0)
精确的字母顺序匹配将适用于以下两行
queryStr= queryStr.replaceAll("\\*+", ".*");
queryStr = (queryStr.startsWith(".*") ? ".*" : "") + queryStr + (queryStr.endsWith(".*") ? "" : ".*");
此行必须立即修改
if (str1.matches(queryStr) || str1.contains(orgQueryStr)){
到
if (str1.matches(queryStr)){
Ex :
list of Strings: "test","detest","test0/1/1"
过滤1:
"te" ---> Prints "test","test0/1/1"
过滤器2:
"te*" --- > Prints "test","test0/1/1"
过滤3:
"*te"
Prints all