2014-05-12 3 views
0

Привет У меня есть список строк ..Дикий поиск карты в Java строк

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" ..

Если элемент имеет пробелы, т его код не работает

+0

Какова цель второй линии? Вы можете установить его значение при назначении. Te \ w * –

ответ

0

Я не специалист по регулярному выражению. Но не заменяя * вообще, и добавляя a.* в конце сделал это для меня

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 только возвращает истину матча полной строки, не соответствует подстроке
  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"),""); 

Здесь он заменяет все «Те» на «»;

Смежные вопросы