2014-05-12 161 views
0

您好我有一個字符串列表..通配符搜索

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

我要搜索的字符串,如「特*」 ..

我用下面的代碼搜索

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

這段代碼只返回 '測試' ..但不是 「Test測試」 ..

如果具有元件的空間,則t他的代碼不起作用

+0

第二行的目的是什麼?您可以在分配中設置其值。 Te \ w * –

回答

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

這是因爲您將*替換爲\ w *,這意味着找到「單詞字符」,直到您可以按照here的描述嘗試替換它.*應該做的伎倆,你也可以擺脫那些醜陋的逃逸:)你也可以使用java8流API,使它看起來更好這樣的:

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

你有幾個問題

  1. matches僅僅爲了一個全串匹配返回true,不是子字符串匹配
  2. \w只匹配單詞字符不是空格。
  3. contains發現文字子字符串匹配,而不是正則表達式。

您的解決方案可以是:

  1. 更換您的查詢字符串與一個實際匹配要配什麼 - 也許你想改變它,使用.replaceAll("\\*", ".*")
  2. 使用Pattern.find,而不是String.match
+0

此解決方案不適用於queryString =「T * t」 – user3627222

1

下面的代碼工作:

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

0

試用Pattern.quote。

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

這是由 「」 替換所有 「TE」;