Найти полное слово в строке Java - PullRequest
1 голос
/ 04 мая 2010

Я пишу кусок кода, в котором я должен найти только полные слова, например, если у меня есть

String str = "today is tuesday";

и я ищу "т", тогда я не должен найти ни одного слова.

Кто-нибудь может сказать, как я могу написать такую ​​программу на Java?

Ответы [ 9 ]

7 голосов
/ 04 мая 2010

Я использую регулярные выражения для таких задач. В вашем случае это должно выглядеть примерно так:

String str = "today is tuesday";
return str.matches(".*?\\bt\\b.*?"); // returns "false"

String str = "today is t uesday";
return str.matches(".*?\\bt\\b.*?"); // returns "true"

Краткое объяснение:

. соответствует любому символу, *? для ноль или более раз , \ b это граница слова .

Более подробную информацию о регулярных выражениях можно найти здесь или специально для Java здесь

5 голосов
/ 04 мая 2010
    String sentence = "Today is Tuesday";
    Set<String> words = new HashSet<String>(
        Arrays.asList(sentence.split(" "))
    );
    System.out.println(words.contains("Tue")); // prints "false"
    System.out.println(words.contains("Tuesday")); // prints "true"

Каждый запрос contains(word) равен O(1), поэтому если вам не хватает собственной сложной структуры словарных данных, это самое быстрое и практичное решение, если у вас есть много слов для поиска в тексте.

Используется String.split, чтобы отделить слова от предложения в разделителе " ". Другие возможные варианты, в зависимости от того, как определена проблема, - это использование \b, привязка границы слова. Проблема значительно усложняется, если принять во внимание все грамматические особенности естественных языков (например, "can't" делится на \b на "can" и "t").

Нечувствительность к регистру может быть легко введена с помощью традиционного трюка нормализации регистра: split и hash sentence.toLowerCase() вместо этого, и посмотрите, если это contains(word.toLowerCase()).

Смотри также

3 голосов
/ 04 мая 2010
String[] tokens = str.split(" ");

for(String s: tokens) {
    if ("t".equals(s)) {
        // t exists
        break;
    }
}
2 голосов
/ 04 мая 2010
String[] words = str.split(" ");
Arrays.sort(words);
Arrays.binarySearch(words, searchedFor);
1 голос
/ 04 мая 2010

используйте регулярное выражение типа "\ bt \ b".

1 голос
/ 04 мая 2010
String str = "today is tuesday";

StringTokenizer stringTokenizer = new StringTokenizer(str);

bool exists = false;

while (stringTokenizer.hasMoreTokens()) {
    if (stringTokenizer.nextToken().equals("t")) {
        exists = true;
        break;
    }
}
0 голосов
/ 26 августа 2013

Я бы предложил использовать это регулярное выражение pattern1 = ". \ bt \ b. " вместо pattern2 = ". ? \ Bt \ b. ?" , Pattern1 поможет вам сопоставить полную строку, если в этой строке встречается «t», а не pattern2, который просто достигает строки «t», которую вы ищете, и игнорирует остальную часть строки. В двух подходах нет большой разницы, и для вашего конкретного случая возврат true / false будет работать в обоих направлениях. Тот, который я предложил, поможет вам импровизировать регулярное выражение в случае внесения дальнейших изменений в ваш вариант использования

0 голосов
/ 04 мая 2010

Я бы порекомендовал вам использовать функциональность "split" для String с пробелами в качестве разделителей, затем последовательно пройти эти элементы и сделать прямое сравнение.

0 голосов
/ 04 мая 2010

Вы можете сделать это, поставив регулярное выражение, которое должно заканчиваться пробелом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...