嗨我有一个这样的段落:
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
答案 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)
答案 2 :(得分:0)
您需要确保您重复的字符不能包含output
或last
。您可以在每个位置使用负向前瞻:
(?<=output )\w+((?:(?!output|last)[^])*)last
首先,我们确保在output
之后开始(就像您在自己的尝试中所做的那样)。然后我们匹配下面的单词(因为你不希望它在你捕获的组中)。然后是有趣的部分:在每个位置,我们检查output
和last
都没有(?!output|last)
。然后我们将任意字符与[^]
匹配。然后我们再说一遍,直到找到last
。您可以使用[^]
或[\s\S]
以及.
选项代替dotall
。
答案 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