Я хочу найти строку с помощью StringTokenizer, но в строке, которую я ищу, есть разделитель - Java

У меня есть внешний файл с именем quotes.txt, и я покажу вам его содержимое:

1 Everybody's always telling me one thing and out the other.
2 I love criticism just so long as it's unqualified praise.
3 The difference between 'involvement' and 'commitment' is like an eggs-and-ham 
  breakfast: the chicken was 'involved' - the pig was 'committed'.

Я использовал это: StringTokenizer str = new StringTokenizer(line, " .'");

Это код для поиска:

String line = "";
boolean wordFound = false;

while((line = bufRead.readLine()) != null) {
    while(str.hasMoreTokens()) {
       String next = str.nextToken();
       if(next.equalsIgnoreCase(targetWord) {
            wordFound = true;
            output = line;
            break;
       }
    }

    if(wordFound) break;
    else output = "Quote not found";
}

Теперь я хочу найти строки "Everybody's" и "it's" в строках 1 и 2, но это не сработает, так как апостроф является одним из разделителей. Если я уберу этот разделитель, я не смогу искать "involvement", "commitment", "involved" и "committed" в строке 3.

Какой подходящий код я могу сделать с этой проблемой? Пожалуйста, помогите и спасибо.


person user1141418    schedule 11.01.2012    source источник


Ответы (2)


Я бы предложил использовать регулярные выражения (класс Pattern< /a>), а не StringTokenizer для этого. Например:

final Pattern targetWordPattern =
    Pattern.compile("\\b" + Pattern.quote(targetWord) + "\\b",
                    Pattern.CASE_INSENSITIVE);

String line = "";
boolean wordFound = false;

while((line = bufRead.readLine()) != null) {
    if(targetWordPattern.matcher(line).find()) {
        wordFound = true;
        break;
    }
    else
        output = "Quote not found";
}
person ruakh    schedule 11.01.2012
comment
Спасибо за это. Но разве это автоматически игнорирует случай? - person user1141418; 11.01.2012
comment
@ user1141418: Добро пожаловать! И -- вы видите флаг Pattern.CASE_INSENSITIVE в вызове Pattern.compile? Это то, что говорит ему игнорировать регистр (или, в терминах регулярных выражений, выполнять совпадение без учета регистра). - person ruakh; 11.01.2012
comment
привет, у меня все еще есть проблема с моей программой. Могу ли я попросить вашей помощи, отправив мне ваше электронное письмо, чтобы я мог показать вам весь код? Пожалуйста и спасибо. - person user1141418; 11.01.2012
comment
@ user1141418: Я не буду публиковать свой адрес электронной почты в StackOverflow, но если вы опубликуете свой, я напишу вам по электронной почте. - person ruakh; 11.01.2012

Токенизировать по пробелу, затем обрезать по символу '.

person Perception    schedule 11.01.2012