0

嗨,我有这样一段:

            output 123

            Deepak everywhere
            Deepak where are

            output 123

            Ankur Everywhere
            Deepak where are

            last

            Deepak everywhere
            Deepak where are

我想在最后一次出现 "output 123" 后提取到 "last" 。这就是我所期望的:

            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

4 回答 4

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)

于 2013-08-18T17:49:29.737 回答
1

这应该工作

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

测试的 url 文本 http://regexr.com?360f9

于 2013-08-18T18:36:01.447 回答
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
于 2013-08-18T17:37:50.273 回答
0

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

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

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

工作演示。

于 2013-08-18T17:34:16.213 回答