我有一些较大的文字,实质上看起来像这样:
abc12..manycharshere...hi - abc23...manyothercharshere...jk
显然有两个项目,每个项目以“abc”开头,数字(12和23)很有趣,最后还有“hi”和“jk”。
我想创建一个正则表达式,允许我解析数字,但只有当两端的两个字符匹配时,即我正在寻找与“jk”相关的数字,但以下正则表达式匹配整个字符串因此返回“12”,而不是“23”,即使非贪婪地匹配该区域与以下内容:
abc([0-9]+).*?jk
有没有办法构建一个匹配上述文本的正则表达式,即检索以“jk”结尾的项目的“23”?
基本上我需要一些类似“匹配abc后跟一个数字,但只有在最后有”jk“才会出现”另一个“abc后跟一个数字出现”的实例
注意:文本/匹配在这里是一个抽象,实际文本更复杂,特别是那些可以显示为“其他字符”的东西,我简化为更清楚地显示底层问题。
答案 0 :(得分:3)
使用像这样的正则表达式。 .*abc([0-9]+).*?jk
答案 1 :(得分:2)
答案 2 :(得分:1)
你需要在这里使用负面预测来使它工作:
abc(?!.*?abc)([0-9]+).*?jk
此处(?!.*?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)