使用Java Matcher匹配短语时如何获取短语各单词的词级索引
解决方案
实现思路
- 调用
Matcher的start()方法,获取匹配短语在原字符串中首个字符的下标 - 统计该下标之前的字符串包含的单词数量,即可得到匹配短语第一个词对应的词级索引
- 拆分目标短语得到单词总个数,从起始索引递增即可生成全部匹配词的索引
完整可运行代码
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class GetMatchWordIndex { public static void main(String[] args) { String line = "I know this sentence repeats but you know that it doesn't"; // 要匹配的目标短语 String targetPhrase = "but you know"; Matcher matcher = Pattern.compile(targetPhrase).matcher(line); if (matcher.find()) { // 取匹配短语的字符起始位置 int matchStartPos = matcher.start(); // 统计起始位置之前的单词数,得到第一个匹配词的索引 String prefixStr = line.substring(0, matchStartPos).trim(); int startWordIndex = prefixStr.isEmpty() ? 0 : prefixStr.split("\\s+").length; // 取目标短语的单词数量 int phraseWordNum = targetPhrase.split("\\s+").length; // 组装索引列表 List<Integer> resultIndexes = new ArrayList<>(); for (int i = 0; i < phraseWordNum; i++) { resultIndexes.add(startWordIndex + i); } // 输出结果:[5, 6, 7] System.out.println(resultIndexes); } } }
适配说明
- 如果文本中存在多个连续空格、制表符等空白分隔符,当前代码中使用的
\\s+正则已经可以自动适配,无需调整 - 若需要避免匹配到单词的部分片段,可以给正则表达式补充单词边界标记,比如改为
Pattern.compile("\\b" + targetPhrase + "\\b")
内容的提问来源于stack exchange,提问作者Hasen
相关产品推荐
相关产品推荐

