2016-04-22 4 views
2

Есть ли способ проверить, содержит ли подстрока целое WORD, а не подстроку.Проверьте, содержит ли строка слово (не подстрока!)

Envision следующий сценарий:

public class Test { 
    public static void main(String[] args) { 
     String[] text = {"this is a", "banana"}; 
     String search = "a"; 

     int counter = 0; 
     for(int i = 0; i < text.length; i++) { 
      if(text[i].toLowerCase().contains(search)) { 
       counter++; 
      } 
     } 

     System.out.println("Counter was " + counter); 
    } 
} 

Это вычисляется

Counter was 2 

Который не то, что я ищу, так как есть только один экземпляр слова «а» в массив.

Как я прочитал это следующим образом:

Условный-тест находит «а» в тексте [0], то «а», соответствующий «это [а]». Однако он также обнаруживает появление «a» в «банане» и, таким образом, увеличивает счетчик.

Как я могу решить эту проблему, чтобы включить только слово «a», а не подстроки, содержащие?

Спасибо!

+0

проверить мой ответ –

ответ

5

Вы можете использовать регулярное выражение, используя Pattern.quote, чтобы избежать любых специальных символов.

String regex = ".*\\b" + Pattern.quote(search) + "\\b.*"; // \b is a word boundary 

int counter = 0; 
for(int i = 0; i < text.length; i++) { 
    if(text[i].toLowerCase().matches(regex)) { 
     counter++; 
    } 
} 

ПримечаниеЭтот также найти "a" в "this is a; pause" или "Looking for an a?" где a не имеет место после него.

+2

' if (текст [i] .toLowerCase(). matches (regex)) {' – Nirekin

+0

@Guillaume спасибо. –

+0

Спасибо! Однако я получаю сообщение «метод quote (String) не определен для типа Pattern»). – northerner

-1

Если слова разделены пробелом, то вы можете сделать:

if((" "+text[i].toLowerCase()+" ").contains(" "+search+" ")) 
{ 
    ... 
} 

Это добавляет два пробела к исходной строке.
eg: "this is a" будет " this is a ".

Затем он ищет слово с фланговыми пространствами. например: Он ищет " a " когда search является "a"

+0

Что делать, если a находится в начале или в конце? – Nadir

+1

@Nadir Именно поэтому мы добавляем пространства! – Hackerdarshi

+0

@Nadir См. Это: ** "" ** + текст [i] .toLowerCase() + ** "" ** – Hackerdarshi

1

могли бы попробовать этот способ:

for(int i = 0; i < text.length; i++) { 
    String[] words = text[i].split("\\s+"); 
    for (String word : words) 
     if(word.equalsIgnoreCase(search)) { 
      counter++; 
      break; 
     } 
} 
0
Arrays.asList("this is a banana".split(" ")).stream().filter((s) -> s.equals("a")).count(); 
0

Конечно, как пишут другие, вы можете начать играть вокруг со всеми видами рисунка на матч «слова» из «текста».

Но дело в том, что в зависимости от основной проблемы, которую вы должны решить, это может быть (далеко) недостаточно. Смысл: вы сталкиваетесь с проблемой нахождения некоторого шаблона в некоторой строке ... или действительно ли вы хотите интерпретировать этот текст в смысле «человеческого языка»? Вы знаете, когда кто-то записывает текст, могут быть тонкие опечатки, странные символы; все виды вещей, из-за которых трудно на самом деле «найти» определенное слово в этом тексте. Если вы не погрузитесь в «аспекты обработки текстов» вещей.

Короче говоря: если ваша задача «найти определенные шаблоны в строках»; тогда все остальные ответы будут выполнены. Но если ваше требование выходит за рамки этого, например «кто-то из людей будет использовать ваше приложение для поиска огромных наборов данных»; тогда вам лучше остановиться сейчас; и рассмотрим возможность использования полнотекстовых поисковых систем, таких как ElasticSearch или Solr.