【问题标题】:matcher to avoid words ending with s,ing, or words in the middle匹配器以避免以 s、ing 或中间单词结尾的单词
【发布时间】:2014-04-30 10:14:59
【问题描述】:

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

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

使用以下模式匹配器,我尝试仅查找与词汇表匹配的确切单词,并避免查找以 s,ing,... 结尾的单词,它只会返回“Account”单词的正确答案,但如果我尝试 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();
    }

【问题讨论】:

  • 你能举个真实的例子吗?我只能说,如果你想匹配精确的单词,使用锚点(^$)或边界(\b)。
  • 这正是我得到的字符串的一部分

标签: java regex matcher


【解决方案1】:

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

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

这些单词边界确保您真正匹配完整的单词并且不会得到部分匹配。

【讨论】:

  • 我只是试试你的建议,但它的行为仍然和以前一样
  • 那么你需要调试你的代码。编译后首先检查模式是什么。
  • 支持长问题的简短回答。 :)
猜你喜欢
  • 2022-11-22
  • 2015-06-23
  • 2018-01-15
  • 1970-01-01
  • 2023-04-11
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多