You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:36:03