Есть ли более эффективный способ поиска ключевого слова в предложении, не зная ключевое слово перед компиляцией? - PullRequest
0 голосов
/ 04 июля 2018

Я студент 2 курса CS, и я написал программу, которая подключается к IRC-клиенту и вынюхивает линии, ожидая, пока пользователь спросит: «О чем пишет твиттер @TWITTERHANDLE?»

Программа ищет ключевое слово "твиттинг", а затем запускает метод, который будет искать хэндл твиттера, используя всю строку ввода.

Проблема в том, что я понимаю, как искать ключевое слово, если я знаю, каким будет это ключевое слово перед компиляцией, но ключевым словом в этом случае может быть любой хэндл твиттера, поэтому я не уверен, какой метод лучше в поиске это будет.

Я попробовал следующее: inputLine.substring (i + 1, inputLine.indexOf ("")); Но он будет использовать первый пробел в inputLine в качестве второго индекса, что даст мне исключение IndexOutOfBounds.

Пример строки ввода следующий

:TWalk!46774664@gateway/web/freenode/ip.11.222.33.444 PRIVMSG #irchacks :What is @TWalkBot tweeting about right now?

И этот код, который у меня есть, на самом деле захватит хэндл твиттера.

/** This method parses the inputLine and returns the Twitter Handle */
    public String getTwitterHandle(String inputLine) {

        boolean firstAt = true;
        char currentChar, tempChar;

        for (int i = 0; i < inputLine.length(); i++) {

            currentChar = inputLine.charAt(i);

            if (currentChar == '@' && firstAt == false) {

                for (int j = i; j < inputLine.length(); j++) {

                    tempChar = inputLine.charAt(j);

                    if (tempChar == ' ') {

                        return inputLine.substring(i + 1, j);

                    }

                }

            }

            else if (currentChar == '@' && firstAt == true) {

                firstAt = false;
            }

        }

        return "User Not Found";
    }

Хотя этот код работает, мне было интересно, есть ли более эффективный способ сделать это, и если да, что я должен смотреть на изменение?

Спасибо

Thomas

1 Ответ

0 голосов
/ 04 июля 2018

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

public class RegExPattern {

    public static void main(String[] args) {
        String test1 = "What is @TWITTERHANDLE tweeting about?";
        String test2 = ":TWalk!46774664@gateway/web/freenode/ip.11.222.33.444 PRIVMSG #irchacks :What is @TWalkBot tweeting about right now?";

        Pattern pattern = Pattern.compile(".*@(\\w+).*tweeting.*");
        Matcher matcher = pattern.matcher(test1);
        if(matcher.find()){
            System.out.println(matcher.group(1)); //Sysouts TWITTERHANDLE
        }

        matcher = pattern.matcher(test2);
        if(matcher.find()){
            System.out.println(matcher.group(1)); //Sysouts TWalkBot
        }
    }
}

Пояснения к РЕГЕКСУ

.*@(\\w+).*tweeting.*

.*@ - Жадный шаблон соответствует строке до последнего появления символа @

(\\w+) - Создает группу 1, за которой следует символ @, который является нашей целью, ищущий символ слова длиной 1 или более

.*tweeting.* - поиск слова для твиттера после группы 1, первый жадный шаблон .* снова используется для учета любого символа между группой 1 и твитированием, а второй - для любых концевых символов после чирикают.

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