如何在java中使用模式匹配器找到精确单词的匹配项

时间:2016-09-16 05:39:20

标签: java regex pattern-matching

  1. 我在这里分享了我的示例代码。在这里,我试图用不同的字符串找到单词“engine”。我用字边界来匹配字符串中的单词。
  2. 如果以#engine(示例)开头,则匹配word。
  3. 它应该只与确切的单词匹配。

    private void checkMatch() {
        String source1 = "search engines has ";
        String source2 = "search engine exact word";
        String source3 = "enginecheck";
        String source4 = "has hashtag #engine";
        String key = "engine";
    
        System.out.println(isContain(source1, key));
        System.out.println(isContain(source2, key));
        System.out.println(isContain(source3, key));
        System.out.println(isContain(source4, key));
    
    }
    
    private boolean isContain(String source, String subItem) {
        String pattern = "\\b" + subItem + "\\b";
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(source);
        return m.find();
    }
    
    **Expected output**
        false
        true
        false
        false
    
    **actual output**
        false
        true
        false
        true
    

4 个答案:

答案 0 :(得分:1)

对于这种情况,您必须使用正则表达式OR而不是单词边界。 \\b匹配单词char和非单词char(反之亦然)。因此,您的正则表达式应该会在#engine中找到匹配项,因为#是一个非单词字符。

private boolean isContain(String source, String subItem) {
    String pattern = "(?m)(^|\\s)" + subItem + "(\\s|$)";
    Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(source);
    return m.find();
}

String pattern = "(?<!\\S)" + subItem + "(?!\\S)";

答案 1 :(得分:0)

更改您的模式如下。

 String pattern = "\\s" + subItem + "\\b";

答案 2 :(得分:0)

如果要查找用空格或字符串的开头/结尾括起来的文字文本,可以使用像\s+这样的空白模式拆分字符串,并检查是否有任何块等于搜索文本。

Java demo

String s = "Can't start the #engine here, but this engine works";
String searchText = "engine";
boolean found = Arrays.stream(s.split("\\s+"))
       .anyMatch(word -> word.equals(searchText));
System.out.println(found); // => true

答案 3 :(得分:0)

将正则表达式更改为

String pattern = "\\s"+subItem + "\\s";

我正在使用

  

\ s一个空格字符:[\ t \ n \ x0B \ f \ r \ n]

有关详细信息,请查看java.util.regex.Pattern javadoc

另外,如果你想支持这样的字符串:

"has hashtag engine"
"engine"

您可以通过添加结尾/起始行终止符(^和$)来改进它 通过使用这种模式:

String pattern = "(^|\\s)"+subItem + "(\\s|$)";