【问题标题】:Wild card search in Java stringsJava 字符串中的通配符搜索
【发布时间】:2014-05-12 06:04:48
【问题描述】:

您好,我有一个字符串列表..

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

这段代码只返回“Test”..而不是“Test Test”..

如果元素有空格,则此代码无效

【问题讨论】:

  • 第二行的目的是什么?您可以在赋值中设置它的值。 T\w*

标签: java string wildcard


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    以下代码有效:

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

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

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

    【讨论】:

      【解决方案3】:

      我绝不是正则表达式专家。但根本没有替换 *,并在最后添加一个 .* 为我做了这件事

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

      【讨论】:

        【解决方案4】:

        你有一些问题

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

        您的解决方案是:

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

        【讨论】:

          【解决方案5】:

          试试 Pattern.quote。

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

          这里将所有的“Te”替换为“”;

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-08-08
            • 2014-02-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多