字符串匹配不适用于特殊字符“/”

时间:2016-04-21 07:23:34

标签: java pattern-matching

我有一个要求,我需要根据过滤器中提供的数据匹配并列出一些对象 用户也可以输入匹配的正则表达式。

例如
正如我所拥有的字符串列表:"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));
    }
}

3 个答案:

答案 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