繁体   English   中英

Java字符串中的通配符搜索

[英]Wild card search in Java strings

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

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);
    }

这段代码仅返回“测试” ..而不返回“测试”。

如果元素有空格,则此代码不起作用

那是因为您要将*替换为\\ w *,这意味着找到“单词字符”,直到可以为止为止,如此处所述尝试替换它.*应该可以解决问题,并且您也可以摆脱那些难看的转义符:)可以使用java8流api使其看起来更好,如下所示:

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

以下代码有效:

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

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

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

你有几个问题

  1. matches仅对全字符串匹配返回true,而不对子字符串匹配返回true
  2. \\w仅匹配单词字符,不匹配空格。
  3. contains查找文字子字符串匹配项,而不是正则表达式。

您的解决方案是:

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

尝试使用Pattern.quote。

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

这里是用“”替换所有“ Te”;

我绝不是正则表达式专家。 但是根本不替换*,最后添加。*对我有用

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);
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM