首页 > 解决方案 > 2个字符串之间的java正则表达式匹配字符串

问题描述

我正在使用 Java 正则表达式,我想匹配字符串链中其他 2 个单词之间具有 5 个或更多字符的单词,但我的正则表达式仅匹配第一个单词。为什么我的正则表达式会停止搜索?

例子:java regex String chain = start here christian call me water next time by facebook there too

regex = (.*)(\bhere\b).?(\b[\w]{5,}\b).+(\bthere\b) 

标签: regex

解决方案


你只用 . 捕获一个词(\b[\w]{5,}\b)。您没有捕获here和之间的任何其他词there

您可以使用

(?:\G(?!^)|^.*\bhere)(?:\W+\w{1,4})*\W+(\w{5,})(?=.+\bthere\b)

请参阅Java 正则表达式演示详情

  • (?:\G(?!^)|^.*\bhere)- 上一个匹配的结尾或字符串的开头,除换行符之外的任何零个或多个字符,尽可能多,然后here作为整个单词
  • (?:\W+\w{1,4})*- 零次或多次重复一个或多个非单词字符,然后是一到四个单词字符(跳过这些匹配项)
  • \W+- 一个或多个非单词字符
  • (\w{5,})- 第 1 组:五个或更多单词字符
  • (?=.+\bthere\b)- 积极的前瞻,确保there在一个或多个字符之后有一个完整的单词,而不是换行字符,尽可能多。

请参阅Java 演示

import java.util.regex.*;
import java.util.*;

class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String text = "java regex String chain = start here christian call me water next time by facebook there too";
        Pattern p = Pattern.compile("(?:\\G(?!^)|^.*\\bhere)(?:\\W+\\w{1,4})*\\W+(\\w{5,})(?=.+\\bthere\\b)");
        Matcher m = p.matcher(text);
        List<String> res = new ArrayList<>();
        while(m.find()) {
            res.add(m.group(1));
        }
        System.out.println(res);
    }
}
// => [christian, water, facebook]

推荐阅读