RegEx匹配一组单词之间的字符串

时间:2014-04-24 09:00:20

标签: java regex regex-lookarounds

我正在尝试匹配字符串中两个单词之间的一组单词。我将使用Java RegEx。

输入文字

The clever fox JUMPED OVER the big dog and ran away.

预期输出

the big

使用RegEx

(?<=(fox\s[A-Z0-9]*))(?s)(.*?)(?=\sdog)

我得到了输出,它给了我狐狸和狗之间的所有单词

JUMPED OVER the big

单词&#34; fox&#34; 后面会跟一个或多个全部大写单词。我需要匹配这两个单词之后的所有单词,直到我得到&#34; dog&#34;

此外,我需要在Capture Group 0中获得所需的输出。我不能使用不同的捕获组。这是我的申请中的限制。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

我害怕java doesn't support variable length look behind assertions

另外capture group 0 is the full text由于不允许变长的lookbehinds(如前所述)是不可能的,除非你知道总会有一定长度的大写单词。

要使用捕获组1执行此操作,请尝试:

(?<=fox)(?:\s[A-Z0-9]*)*\s?(.*?)(?=\sdog)

编辑:修正了正则表达式中的拼写错误

编辑2:澄清全文问题。

编辑3:取决于愚蠢的java如何使用“非显而易见的最大长度的lookbehind组”,这可能有效:(?<=fox(?:\s[A-Z0-9]{5,7}){1,2})(.*?)(?=\sdog)但是我需要问一下,是什么让你确信你需要这个才能被捕获0组?我有点怀疑是这样的,即使它确实如此,你可以只取出输出然后再次对.*运行它来获得捕获组0的正则表达式,你真的不需要这个作为一个要求。

答案 1 :(得分:1)

您可以使用此正则表达式:

^.*fox[A-Z0-9\s]*(.*)dog.*$

您可以在函数中通过参数传递foxdog,以便在其他情况下使用。

答案 2 :(得分:0)

没有正则表达式:

    String fox = "The clever fox JUMPED OVER the big dog and ran away.";

    boolean start = false;
    for (String word : fox.split("\\s")) {
        if ("fox".equals(word)) {
            start = true;
            continue;
        }
        if ("dog".equals(word)) {
            break;
        }
        if (start) {
            System.out.println(word);
        }
    }