我参加了大学的微软编码挑战,这就是问题:
编写一个程序,它接受两个字符串作为输入,一个是查询,另一个是可能包含或不包含该查询的字符串。您的程序需要查找查询是否包含在正文字符串中。
1)如果正文与正文中单词的开头匹配,则查询应仅匹配正文。
2)也就是说,查询的开头也必须是正文中单词的开头。例如,查询“cat”将匹配字符串“cat”,“cat toy”,“this is a cat”和“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");
}
}
}
答案 0 :(得分:1)
我认为将查询转换为正则表达式就足以满足所有给定的条件。
根据问题,
点1&amp; 2,只有当查询字符串位于文本的开头或成功填充空格时,查询才应与文本匹配。所以基本上正则表达式就像 -
(^|\s)(query-string)
第3点需要查询不区分大小写,可以在编译query-regex时处理。
对于第4点和第4点5-即使查询没有空格,查询也应与文本匹配,但如果查询中存在空格,则应在文本中正确匹配。
因此,我们需要以这样的方式转换我们的正则表达式,即在每个字符(或空格)之后,正则表达式可以处理可能存在或不存在的空间。这样,我们假设字符(或空格) )必须匹配,而后面的空格是有条件的。
这应该有效 -
public static boolean find_match(String query, String text){
String regex = "(?:^|\\s)(" + query.replaceAll(".(?!$)", "$0(?:\\\\s*)") + ")";
//System.out.println("Regex -> " + regex);
Pattern re = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
return re.matcher(text).find();
}
测试此功能 -
public static void main(String []args){
String query1 = "cat";
String[] text1 = {
"Cat",
"caT toy",
"This is a CaT",
"caTty",
"loCation"
};
for(String s : text1){
System.out.println("Query -> " + query1 + "\nText -> " + s + "\n" + find_match(query1, s) + "\n");
}
String query2 = "luke j";
String query3 = "lukej";
String[] text2 = {
"Luke Johnson",
"lukejohnson",
"Luke Johson",
"This is Luke Johnson",
"L ukeJohnson",
"L uke Johnson"
};
for(String s : text2){
System.out.println("Query -> " + query2 + "\nText -> " + s + "\n" + find_match(query2, s));
System.out.println("Query -> " + query3 + "\nText -> " + s + "\n" + find_match(query3, s) + "\n");
}
}
输出 - &gt;
Query -> cat
Text -> Cat
true
Query -> cat
Text -> caT toy
true
Query -> cat
Text -> This is a CaT
true
Query -> cat
Text -> caTty
true
Query -> cat
Text -> loCation
false
Query -> luke j
Text -> Luke Johnson
true
Query -> lukej
Text -> Luke Johnson
true
Query -> luke j
Text -> lukejohnson
false
Query -> lukej
Text -> lukejohnson
true
Query -> luke j
Text -> Luke Johson
true
Query -> lukej
Text -> Luke Johson
true
Query -> luke j
Text -> This is Luke Johnson
true
Query -> lukej
Text -> This is Luke Johnson
true
Query -> luke j
Text -> L ukeJohnson
false
Query -> lukej
Text -> L ukeJohnson
true
Query -> luke j
Text -> L uke Johnson
true
Query -> lukej
Text -> L uke Johnson
true
希望这有助于 -
答案 1 :(得分:0)
尝试使用此方法:
public static boolean match(String text, String query) {
text = text.toLowerCase();
query = query.toLowerCase();
String noSpaces = text.replaceAll(" ", "");
String[] tWords = text.split(" ");
if (text.startsWith(query) || noSpaces.startsWith(query)) {
return true;
}
for (int i = 0; i < tWords.length; i++) {
if (tWords[i].startsWith(query)) {
return true;
}
}
return false;
}
答案 2 :(得分:0)
有很多可能的情况可以确定您的QUERY是否包含在BODY中。让我们来解释一下CAT和你在问题中提供的另一个样本正文字符串。
您的查询将具有以下版本: - &LT; 猫&GT; :案例当猫在句子之间 &LT; _cat&GT; :当句子以猫结尾或后跟,或者。或任何符号(您可能想使用ASCII检查后续的字符) :当句子以cat开头时。 :正文是单字句猫你可以使用SIZE功能来确认。 _被称为SPACE
首先,您需要将整个正文和查询字符串转换为LOWERCASE或UPPERCASE(或者不是因为没有指定匹配操作是否区分大小写的问题)