Java正则匹配两个指定单词间长度≥5的单词仅匹配首个的原因是什么?
正则仅匹配到第一个符合要求单词的原因
- 你的正则表达式中仅定义了1个用于捕获长度≥5单词的分组
(\b[\w]{5,}\b),单次匹配下只会捕获一次符合规则的内容 - 正则中的
.*、.+均为贪婪匹配模式,会尽可能多的吞噬字符,直接跳过中间其余符合长度要求的单词,仅会保留第一个(或最后一个,取决于贪婪匹配的吞吃范围)符合要求的单词 - 未开启全局匹配模式,正则完成一次完整匹配(从开头匹配到
there的位置)后就会终止搜索,不会继续查找其余符合条件的单词
正确实现方案
你需要分两步完成匹配需求:
- 先提取出
here和there两个分界词之间的全部内容 - 对提取出的中间内容做全局正则匹配,遍历拿到所有长度≥5的单词
Java代码示例
import java.util.regex.Matcher; import java.util.regex.Pattern; public class MatchWordBetween { public static void main(String[] args) { String sourceStr = "java regex String chain = start here christian call me water next time by facebook there too"; // 用零宽断言提取here和there中间的内容,不包含分界词本身 Pattern betweenPtn = Pattern.compile("(?<=\\bhere\\b).*(?=\\bthere\\b)"); Matcher betweenMatcher = betweenPtn.matcher(sourceStr); if (betweenMatcher.find()) { String midContent = betweenMatcher.group(); // 匹配所有长度≥5的单词,开启全局遍历 Pattern wordPtn = Pattern.compile("\\b\\w{5,}\\b"); Matcher wordMatcher = wordPtn.matcher(midContent); while (wordMatcher.find()) { System.out.println(wordMatcher.group()); } } } }
输出结果
christian water facebook
内容的提问来源于stack exchange,提问作者watercold
相关产品推荐
相关产品推荐

