正则表达式在最后一次出现后提取线条

时间:2013-08-18 17:29:36

标签: java regex

嗨我有一个这样的段落:

            output 123

            Deepak everywhere
            Deepak where are

            output 123

            Ankur Everywhere
            Deepak where are

            last

            Deepak everywhere
            Deepak where are

我想在最后一次出现“输出123”后提取到“最后”。这就是我的期望:

            Ankur Everywhere
            Deepak where are

            last

我使用此RegEx模式 - (?<=(output))([^\\n]*)last。但是使用它,我得到的是:

            output 123

            Deepak everywhere
            Deepak where are

            output 123

            Ankur Everywhere
            Deepak where are

            last

有人可以帮忙吗?我使用此工具 - http://regexr.com?360ek

4 个答案:

答案 0 :(得分:1)

您可以使用此模式并提取第一个捕获组:

output\\b[^\\n]*\\s*((?>[^o\\s]++|\\s++(?!last\\b)|o(?!utput\\b))++)(?=\\s+last\b)

细节:

output\\b[^\\n]*\\s* # the begining (exclude from the final result
                     # but used as an anchor)
(                         # open the capturing group
    (?>                   # open an atomic group (all the possible content)
        [^o\\s]++         # all that is not a "o" or a white character
      |                   # OR
        \\s++(?!last\\b)  # white characters but not followed by "last"
                          # (here the possessive quantifier is needed to forbid
                          # backtracks)
      |                   # OR
        o(?!utput\\b)     # "o" not followed by "utput\b"
    )++                   # repeat the atomic group one or more times
)                         # close the capturing group
(?=\\s+last\b)            # followed by white characters and "last"

您可以使用以下代码找到捕获组的内容:m.group(1)

答案 1 :(得分:1)

这应该有效

  

((?&lt; =(输出123)))([^ \ n(?<= 1)] *)最后

Tested url text http://regexr.com?360f9

答案 2 :(得分:0)

您需要确保您重复的字符不能包含outputlast。您可以在每个位置使用负向前瞻:

(?<=output )\w+((?:(?!output|last)[^])*)last

首先,我们确保在output之后开始(就像您在自己的尝试中所做的那样)。然后我们匹配下面的单词(因为你不希望它在你捕获的组中)。然后是有趣的部分:在每个位置,我们检查outputlast都没有(?!output|last)。然后我们将任意字符与[^]匹配。然后我们再说一遍,直到找到last。您可以使用[^][\s\S]以及.选项代替dotall

Working demo.

答案 3 :(得分:0)

这应该有效:

Pattern p = Pattern.compile("(?<=output )(?!.*?output )[^\\s]+(.*?last)", Pattern.DOTALL);
Matcher m = p.matcher(s);
if (m.find()) {
    System.out.println(m.group(1));
}
else
    System.out.println("NO Match");

<强>输出:

Ankur Everywhere
Deepak where are

last