Java字符串中的通配符搜索

时间:2014-05-12 06:04:48

标签: java string wildcard

嗨,我有一个字符串列表..

List list = new ArrayList();
list.add("Test");
list.add("Test Test");
list.add("Test Second");

我想搜索类似" Te *" ..

的字符串

我使用以下代码进行搜索

queryString = "Te*";
    queryString = queryString.replaceAll("\\*", "\\\\w*");
    for (String str : values) {
            if (str.matches(queryStr) || str.contains(queryStr))
                list.add(str);
    }

这段代码仅返回'测试'但不是"测试测试" ..

如果元素有空格,则此代码无法正常工作

5 个答案:

答案 0 :(得分:2)

那是因为您将*替换为\ w *,这意味着找到"字符"直到你可以,正如所描述的那样here尝试替换它应该做的技巧.*你也可以摆脱那些丑陋的逃脱:)也可以使用java8流api让它看起来更漂亮像这样:

List<String> list = values.stream().filter( s -> s.matches(queryStr)).collect(Collectors.toList());

答案 1 :(得分:1)

以下代码有效:

String queryStr = "Te.*";
for (String str : list) {
    if (str.matches(queryStr))
        values.add(str);
}
System.out.println(values);

第一个问题是matches()匹配完整字符串,因此您必须更新regexp。 \w将匹配单词,如果有空格,则匹配另一个单词。这与matches()结合使得它永远不会起作用。我修改了正则表达式,因此它会匹配以Te开头的所有字符串,因为.*将匹配其他所有字符串。

还有另一个错误,您尝试迭代str列表,然后将找到的元素添加到同一列表中。 Java会抛出ConcurrentModificationException

答案 2 :(得分:0)

你有一些问题

  1. matches仅对全字符串匹配返回true,而不是子字符串匹配
  2. \w仅匹配单词字符而非空格。
  3. contains找到文字子字符串匹配,而不是正则表达式。
  4. 您的解决方案是:

    1. 将您的查询字符串替换为实际匹配您想要匹配的字符串 - 可能您想要将其更改为使用.replaceAll("\\*", ".*")
    2. 使用Pattern.find代替String.match

答案 3 :(得分:0)

尝试使用Pattern.quote。

yourString.replaceAll(Pattern.quote("Te"),"");

这里正在取代所有的&#34; Te&#34; by&#34;&#34;;

答案 4 :(得分:0)

我绝不是一名正则表达式专家。但是根本没有替换*,最后添加。*为我做了

List<String> list = new ArrayList<String>();
        list.add("Test");
        list.add("Test Test");
        list.add("Test Second");
        String queryString = "Te*s";
//      queryString = queryString.replaceAll("\\*", "\\.\\*");
        queryString = queryString.concat(".*");
        for (String str : list) {
                if (str.matches(queryString))
                    System.out.println(str);
        }