[英]Java regex must match at beginning or end of String
我正在编写一个程序,该程序将两个字符串作为输入,如果第一个字符串存在,则搜索第二个字符串。 要返回 true,第一个 String 必须位于第二个 String 中单词的开头/结尾。 它不能位于第二个字符串中的单词中间。
示例 1(必须返回 false):
String s1 = "press";
String s2 = "Regular expressions is hard to read"
示例 2(必须返回 true):
String s1 = "ONE";
String s2 = "ponep,onep!"
示例 3(必须返回 true):
String s1 = "ho";
String s2 = "Wow! How awesome is that!"
这是我的代码,它在第三个示例中返回 false 而不是 true:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String part = scanner.nextLine();
String line = scanner.nextLine();
Pattern pattern = Pattern.compile("((.+\\s+)*|(.+,+)*"+part+"\\w.*)"+"|"+"(.+"+part+"(\\s+.+)*)",Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(line);
System.out.println(matcher.matches());
}
请帮忙
查看单词边界匹配器。 它是一个长度为 0 的匹配器,但只匹配单词的边界(单词和非单词字符\\w
和\\W
之间的位置)。
你的正则表达式本质上是\\bkeyword|keyword\\b
。 词首或词尾的关键字。
boolean check(String s1, String s2) {
Pattern pattern = Pattern.compile("\\b" + Pattern.quote(s1) + "|" + Pattern.quote(s1) + "\\b", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(s2);
return matcher.find();
}
我添加的一些关键点是Pattern.quote(s1)
以确保如果第一个单词是ab|c
类的东西,它将逐字匹配这 4 个字符,而不是将其解释为正则表达式。 另外,我已经将最后的检查切换到matcher.find()
以便我们可以编写一个更简单的正则表达式,因为关心的只是匹配子字符串的存在。
我的建议是
true
则返回 true示例代码
class Test {
public static void main(String[] args) {
String first = "ho";
String second = "Wow! How awesome is that!";
String[] words = second.split("\\s|,");
List<Boolean> results = Arrays.stream(words)
.map(String::toLowerCase)
.map(word -> match(first.toLowerCase(), word)).collect(Collectors.toList());
System.out.println(results);
System.out.println(results.contains(true));
}
private static boolean match(String patternWord, String matchedWord) {
Pattern patten1 = Pattern.compile("^" + patternWord + "\\S*");
Matcher matcher1 = patten1.matcher(matchedWord);
Pattern pattern2 = Pattern.compile("\\S*" + patternWord + "$");
Matcher matcher2 = pattern2.matcher(matchedWord);
return matcher1.matches() || matcher2.matches();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.