Искать ключевое слово из массива во входной строке и распечатывать их

Я делал это с почти прошлых нескольких дней, но все еще не в состоянии получить требуемый результат. Ну у меня есть массив сказать wordlist[]={"One","Two","Three","Four","Five"};а затем я беру информацию от пользователя.

String input="I have three no, four strings";

Теперь я хочу выполнить операцию поиска в строке, чтобы проверить наличие слов, доступных в массиве wordlist[]; Как и в приведенном выше примере, входная строка содержит слова три и четыре, которые присутствуют в массиве. поэтому он должен иметь возможность печатать эти слова из массива, доступного в строке, и если нет слов из списка слов [], то он должен вывести "Нет совпадений найдено".

Вот мой код, я поражен этим. пожалуйста

import java.util.regex.*;
import java.io.*;
class StringSearch{
    public static void main(String ...v)throws IOException{
        BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
        String wordlist[]={"one","two","three","four","five"};
        String input=cin.readLine();
        int i,j;
        boolean found;
        Pattern pat;
        Matcher mat;
        Pattern spliter=Pattern.compile("[ ,.!]");
        String ip[]=spliter.split(input);
        System.out.println(ip[2]);
        for(i=0; i<wordlist.length;i++){
            for(j=0;j<ip.length;j++){
                pat=Pattern.compile("\b"+ip[j]+"\b");
                mat=pat.matcher(wordlist[i]);
                if(){
                        // No Idea What to write here
                }
            }
        }


    }
}

3 ответа

Вам нужно использовать matches с условием input.matches(".*\\b"+wordlist[i]+"\\b.*")

.*: соответствовать чему угодно

\\b: граница слова, чтобы избежать совпадения four с fourteen

а также wordlist[i] твое слово

1.) Обход вашего массива с помощью цикла

2.) Выбрать слова из массива и использовать matches с данным регулярным выражением, чтобы избежать соответствия four с fourteen

    String wordlist[]={"one","two","three","four","five"};
    String input="I have three no, fourteen strings";
    int i;
    boolean found=false;
    // Traverse your array
    for(i=0; i<wordlist.length;i++){
           // match your regex containing words from array against input
            if(input.matches(".*\\b"+wordlist[i]+"\\b.*")){
                // set found = true
                found=true;
                // display found matches
                System.out.println(wordlist[i]);
            }
        }
    // if found is false here then mean there was no match
    if (!found) {
        System.out.println("No Match Found");
    }

Выход:

three

Используя потоки Java8 вы можете сделать:

 ...
 import java.util.Arrays;
 import java.util.stream.Collectors;
 ...

 String wordlist[]={"one","two","three","four","five"};
 String input=cin.readLine();
 String foundStrings = 
       Arrays.stream(wordlist)
       .filter(s->input.matches(".*\\b"+s+"\\b.*"))
       .collect(Collectors.joining("\n"));

 System.out.print(foundStrings.isEmpty() ? "No Match Found\n": foundStrings);

Здесь готовим регулярное выражение: \\b(один | два | три | четыре | пять)\\b и проверяем счетчик совпадений.

String wordlist[]={"one","two","three","four","five"};
String input="I have three no, fourteen strings";

StringBuilder regexBuilder = new StringBuilder("\\b").append("(").append(String.join("|", wordlist)).append(")").append("\\b");
String regexExp = regexBuilder.toString();
regexBuilder.setLength(0);

Pattern p = Pattern.compile(regexExp);
Matcher matcher = p.matcher(input);

int count = 0;
while (matcher.find())
{
      System.out.println(matcher.group());
      count++;
}

if( count == 0){
    System.out.println("No Match Found");
}
Другие вопросы по тегам