я пошел на майкрософт кодирования вызов в колледже, и это был задан вопрос:Текст сопоставления запросов (сложно)
Напишите программу, которая принимает две строки в качестве входных данных, один запрос, а другой строка, которая может содержать или не содержать этот запрос. Ваша программа должна найти, если запрос содержится в строке тела.
1) Запрос должен соответствовать только тексту тела, если он соответствует началу слова в тексте тела.
2) То есть начало запроса также должно быть началом слова в тексте тела. Например, запрос «cat» будет соответствовать строкам «cat», «cat toy», «это кошка» и «catty». Однако запрос «cat» не соответствует строке «location».
3) Ваша программа должна быть нечувствительна к регистру.
4) Ваша программа должна иметь возможность сопоставлять запросы без пробелов в них, даже если тело имеет пробелы. Например, строка «Luke Johnston» будет соответствовать запросу «luke j» и запросу «lukej».
5) Однако это не работает наоборот. Запрос «luke j» не должен соответствовать строке «lukejohnston».
Я могу написать код, который удовлетворяет первым 4 требованиям, но я не могу найти решение для 5-го. Любые подсказки/помощь приветствуются. Вот моя версия кода.
package regex;
import java.util.Scanner;
public class TextQueryMatch {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.print("Enter the Text: ");
String text = in.nextLine();
text = text.toLowerCase();
String[] substexts = text.split("\\s");
text = "";
for(int i = 0; i < substexts.length; i++){
char capLetter = Character.toUpperCase(substexts[i].charAt(0));
text += capLetter + substexts[i].substring(1, substexts[i].length());
}
System.out.println(text);
System.out.print("Enter the Query: ");
String query = in.nextLine();
query = query.toLowerCase();
String[] subquerys = query.split("\\s");
query = "";
for(int i = 0; i < subquerys.length; i++){
char capLetter = Character.toUpperCase(subquerys[i].charAt(0));
query += capLetter + subquerys[i].substring(1, subquerys[i].length());
}
System.out.println(query);
System.out.print("Match: ");
if(text.matches("(.*)"+query.charAt(0)+"(.*)")){
text=text.toLowerCase();
query=query.toLowerCase();
System.out.print(text.matches("(.*)"+query+"(.*)"));
}else{
System.out.print("False");
}
}
}
Это помогло. Не могли бы вы прокомментировать заявление regex. Для запроса = "luke j" он дает regex = (?:^| \ S) (l (?: \ S *) u (?: \ S *) k (?: \ S *) e (?: \ S *) (?: \ s *) j). Я новичок в использовании регулярных выражений и ссылался на [этот учебник] (http://www.vogella.com/tutorials/JavaRegularExpressions/article.html) и не смог найти несколько символов. – GauravPandey
Группировка символов,() и (? :) - это группы захвата и не захвата. Обратитесь к ним [здесь] (http://www.regular-expressions.info/brackets.html). Для остальных символов используйте [this] (http://www.rexegg.com/regex-quickstart.html) – Kamehameha
[This] (http://www.regular-expressions.info/tutorial.html) учебник довольно всеобъемлющий, если вы хотите правильно начать регулярное выражение с нуля – Kamehameha