我正在尝试将文本与词汇表列表进行匹配。问题是我的模式显示一个文本的不同行为。 例如,这是我的文字:
\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();
}
答案 0 :(得分:2)
你的模式中的\\W
有什么用?如果只是为了确保单词结束,那么请改用word boundaries:
Pattern findTerm = Pattern.compile("(\\b" + item.getTerm() + "\\b)",Pattern.DOTALL);
这些单词边界确保您确实匹配整个单词并且不会获得部分匹配。