Искать ключевое слово из массива во входной строке и распечатывать их
Я делал это с почти прошлых нескольких дней, но все еще не в состоянии получить требуемый результат. Ну у меня есть массив сказать 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");
}