matcher避免以s,ing或中间的单词结尾的单词

时间:2014-04-30 10:14:59

标签: java regex matcher

我正在尝试将文本与词汇表列表进行匹配。问题是我的模式显示一个文本的不同行为。 例如,这是我的文字:

\nfor Sprints \nSprints \nSprinting \nAccount Accounts Accounting\nSprintsSprints 

使用以下模式匹配器,我尝试只找到与词汇表匹配的确切单词,并且避免找到以s,ing结尾的单词,...它只返回“正确”的“帐户”单词的答案,但是如果我尝试Sprint,然后它返回Sprint,Sprinting等,这是不对的:

Pattern findTerm = Pattern.compile("(" + item.getTerm() + ")(\\W)",Pattern.DOTALL);

这是我的代码:

    private static String findGlossaryTerms(String response, List<Glossary> glossary) {

        StringBuilder builder = new StringBuilder();
        for (int offset = 0; offset < response.length(); offset++) {
            boolean match = false;
            if (response.startsWith("<", offset)) {
                String newString = response.substring(offset);
                Pattern findHtmlTag = Pattern.compile("\\<.*?\\>");
                Matcher matcher = findHtmlTag.matcher(newString);
                if (matcher.find()) {
                    String htmlTag = matcher.group(0);
                    builder.append(htmlTag);
                    offset += htmlTag.length() - 1;
                    match = true;
                }
            }

            for (Glossary item : glossary) {
                if (response.startsWith(item.getTerm(), offset)) {
                    String textFromOffset = response.substring(offset - 1);
                    Pattern findTerm = Pattern.compile("(" + item.getTerm() + ")(\\W)",Pattern.DOTALL);
                    Matcher matcher = findTerm.matcher(textFromOffset);
                    if (matcher.find()) {
                        builder.append("<span class=\"term\">").append(item.getTerm()).append("</span>");
                        offset += item.getTerm().length() - 1;
                        match = true;
                        break;
                    }
                }
            if (!match)
                builder.append(response.charAt(offset));

        }
        return builder.toString();
    }

1 个答案:

答案 0 :(得分:2)

你的模式中的\\W有什么用?如果只是为了确保单词结束,那么请改用word boundaries

Pattern findTerm = Pattern.compile("(\\b" + item.getTerm() + "\\b)",Pattern.DOTALL);

这些单词边界确保您确实匹配整个单词并且不会获得部分匹配。