正则表达式查询第n次匹配

时间:2013-03-31 00:04:00

标签: regex

我正在寻找一个只与第3个,第6个,第9个,第12个,第15个,第18个等相匹配的regrex,在下文中“blah”这个词,忽略第1个,第2个,第4个, 5号,7号,8号......等等。正则表达式应该只匹配3次出现的blah

The Band blah The Band blah  blah Up On Cripple Creek (2000 Digital Remaster) blah 2000 blah Greatest Hits blah The Band blah  blah The Weight (2000 Digital Remaster) blah 2003 blah Rhythm Of The Rain blah The Cascades blah  blah Rhythm Of The Rain (LP Version) blah 2005 blah Chronicle Volume One blah Creedence Clearwater Revival blah  blah Who'll Stop the Rain blah 1976 blah The Complete Sun Singles, vol. 1 blah Johnny Cash blah  blah I Walk the Line blah 2001 blah Greatest Hits blah Bob Seger blah  blah Against The Wind blah 1980 blah Their Greatest Hits blah The Eagles blah  blah Lyin' Eyes blah 1975 blah Johnny Horton's Greatest Hits blah Johnny Horton blah  blah North To Alaska 

提前致谢。

仅供参考,我将在Hive中使用此正则表达式

3 个答案:

答案 0 :(得分:2)

美好而紧凑:

(?:blah.*?){2}(blah)

答案 1 :(得分:0)

'(?:(?:.+?)blah(?:.+?)blah(?:.+?)(blah))'

这应该有用,但我不确定正则表达式是非常长文本的最佳解决方案

编辑避免第一次捕捉......虽然很明显OP没有得到正则表达式如何工作

答案 2 :(得分:0)

由于我不认为以前的答案都是你想要的(根据你在评论中的说法),我也会在这里加盖印章。
免责声明:我认为没有任何有效的方法可以只捕获第三个问题,但是,你仍然可以做到这一点。
第1步:反转字符串,你需要任意长度的lookbehind,这是你不能拥有的。但是你应该通过反转弦并使用任意长度的前瞻来获得它们 第2步:下面的正则表达式应该抓住你想要的东西:

/halb(?=(?:(?:[^h]|h(?!alb))*halb){2}(?:[^h]|h(?!alb)|halb(?:(?:[^h]|h(?!alb))*halb){2})*$)/

第3步:尝试重新排序/撤消...

(注意:因为我非常困,所以我没有测试过,如果需要几个小时就会纠正它......)

修改
好的,现在纠正了。所以它有效,但你仍然有向后的字符串。您必须反转数组中的所有字符串,然后是数组。但是,it works。再一次,如果你遇到性能问题,如果可以的话,你可能想尝试使用占有量词。