How to non-greedy multiple lookbehind matches

我只是一个虾纸丫 提交于 2019-12-03 18:00:25

问题


Source:    <prefix><content1><suffix1><prefix><content2><suffix2>
Engine:    PCRE

RegEx1:    (?<=<prefix>)(.*)(?=<suffix1>)
RegEx2:    (?<=<prefix>)(.*)(?=<suffix2>)

Result1:   <content1>
Result2:   <content1><suffix1><prefix><content2>

The desired result for RegEx2 is just <content2> but it is obviously greedy. How do I make RegEx2 non-greedy and use only the last matching lookbehind?

[I hope I have translated this correctly from the NoteTab syntax. I don't do much RegEx coding. The <prefix>, <content> & <suffix> terms are just meant to represent arbitrary strings. Only the "<" in the "?<=" lookbehind command is significant.]

I suspect it is something simple but after too many hours of searching I'm giving up on solving it myself.

Thanks for the help

Art


回答1:


I just had the same problem. But in my case it was

(?<=<prefix>)(?:.(?!<prefix>))*(?=<suffix>)

That did what I wanted.

This expression will match anything that is a concatenation of characters between <prefix> and <suffix> and doesn't contain the substring <prefix>. (I think so. I'm not very good at regexp.)




回答2:


I suggest you use:

(?<=<prefix>)(((?!<prefix>).)*)(?=<suffix2>)

This makes sure that there can be no <prefix> inside the match. The complete match result will be <content2>




回答3:


Put something greedy in front of it?

(?:.*)(?<=<prefix>)(.*)(?=<suffix2>)

Since the greedy (?:.*) will gobble as much as it can, only the minimum will be matched by the rest of the pattern - effectively making the rest non-greedy.

The non-greedy .*? might also work:

(?<=<prefix>)(.*?)(?=<suffix2>)


来源:https://stackoverflow.com/questions/1232220/how-to-non-greedy-multiple-lookbehind-matches

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!