正则表达式匹配以特定字符串开头的所有行

时间:2013-04-24 07:45:57

标签: regex groovy

我有这个非常长的cfg文件,我需要找到以特定字符串开头的最新一行。 cfg文件的一个示例:

...
# format: - search.index.[number] = [search field]:element.qualifier
...    
search.index.1 = author:dc.contributor.*
...
search.index.12 = language:dc.language.iso
...
jspui.search.index.display.1 = ANY
...

我需要能够获得以search.index.[number]开头的最后一行,更具体:我需要那个数字。对于上面的代码段,该数字将 12

正如您所看到的,还有其他行也包含该模式,但我想要匹配那些。

我正在使用Groovy作为编程/脚本语言。

任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:1)

我认为你不应该这样做但是......
如果你可以进行多行搜索(无论如何你必须在这里),唯一的方法是向后读取文件。首先,用.*(om nom nom)吃掉所有东西(如果你可以点数全部匹配,(?:.|\s)*如果你不能。)现在匹配您的模式search\.index\.(\d+)。并且您希望在一行的开头匹配此模式:(?:^|\n)(希望您不使用某些不使用\n作为新行字符的疯狂格式。)< / p>

因此...

(?:.|\s)*(?:^|\n)search\.index\.(\d+)

该号码应位于第一个匹配组中。 (Test in JavaScript

PS:我不认识groovy,很抱歉,如果它完全不合适。

修改
这也应该有效:

search\.index\.(\d+)(?!(?:.|\s)*?(?:^|\n)search\.index\.\d+)

答案 1 :(得分:1)

尝试将此作为表达式:

^search\.index\.(\d+)/

然后使用Groovy,您可以获得结果:

 matcher[0][0]

Here is an explanation page.

答案 2 :(得分:1)

你试过了吗?

def m = lines =~ /(?m)^search\.index\.(\d+)/
m[ -1 ][ 1 ]