繁体   English   中英

Java 正则表达式必须在字符串的开头或结尾匹配

[英]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()以便我们可以编写一个更简单的正则表达式,因为关心的只是匹配子字符串的存在。

我的建议是

  1. 用指定的分隔符(空格或逗号,如果是你的情况)拆分第二个字符串
  2. 创建正则表达式以匹配开头或结尾的指定单词。
  3. 使用正则表达式映射拆分词以获得布尔结果数组
  4. 如果结果数组中包含任何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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM