正则表达式非贪婪但仍然

时间:2014-09-08 14:41:30

标签: java regex regex-greedy

我有一些较大的文字,实质上看起来像这样:

abc12..manycharshere...hi - abc23...manyothercharshere...jk

显然有两个项目,每个项目以“abc”开头,数字(12和23)很有趣,最后还有“hi”和“jk”。

我想创建一个正则表达式,允许我解析数字,但只有当两端的两个字符匹配时,即我正在寻找与“jk”相关的数字,但以下正则表达式匹配整个字符串因此返回“12”,而不是“23”,即使非贪婪地匹配该区域与以下内容:

abc([0-9]+).*?jk

有没有办法构建一个匹配上述文本的正则表达式,即检索以“jk”结尾的项目的“23”?

基本上我需要一些类似“匹配abc后跟一个数字,但只有在最后有”jk“才会出现”另一个“abc后跟一个数字出现”的实例

注意:文本/匹配在这里是一个抽象,实际文本更复杂,特别是那些可以显示为“其他字符”的东西,我简化为更清楚地显示底层问题。

5 个答案:

答案 0 :(得分:3)

使用像这样的正则表达式。 .*abc([0-9]+).*?jk

demo here

答案 1 :(得分:2)

我想你想要这样的东西,

abc([0-9]+)(?=(?:(?!jk|abc[0-9]).)*jk)

DEMO

答案 2 :(得分:1)

你需要在这里使用负面预测来使它工作:

abc(?!.*?abc)([0-9]+).*?jk

RegEx Demo

此处(?!.*?abc)为负面预测,确保匹配abc,而不是abc,因此请确保在abc和{{1}之间关闭字符串匹配。

答案 3 :(得分:1)

非贪婪不会改变规则,即返回第一个匹配。因此abc([0-9]+).*?jk会在“jk 数字”之后找到第一个abc而不是最后一个,但仍然匹配第一个“abc ”。

解决此问题的一种方法是告诉该点不应与abc([0-9]+)匹配:

abc([0-9]+)((?!abc([0-9]+)).)*jk

如果让整个模式完全匹配并不重要,那么可以更简单:

.*(abc([0-9]+).*?jk)

在这种情况下,它是包含您的预期匹配的第1组。该模式使用贪婪的matchall来确保最后可能的“abc 数字”在组内匹配。

答案 4 :(得分:0)

假设连字符分隔“项目”,此正则表达式将捕获目标项目中的数字:

abc([0-9]+)[^-]*?jk

请参阅demo