2013-04-24 412 views
2

我有這個非常長的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],更具體的行中最後一次出現:我需要的數量。對於上面的代碼片段,該數字將爲。

正如你所看到的,還有其他的行也包含該模式,但我做不是想要匹配那些。

我使用Groovy作爲編程/腳本語言。

任何幫助表示讚賞!

+0

我敢打賭,有類似 「lastIndexOf()」 – 2013-04-24 07:54:23

回答

1

你試過:

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

工程就像一個魅力。謝謝! P.S.也許你可以澄清你的答案更多一點?它的工作原理,但我有點不清楚爲什麼。 – 2013-04-24 08:09:35

+1

'(?m)'告訴Groovy做一個多行正則表達式匹配,然後'm [-1]'告訴它得到最後一個匹配,並且'[1]'從最後一個匹配中獲得第一個組比賽。所以在你的例子中,'m [0] [1]'是第一個匹配'1'和'm [-1] [1]'將是最後一個匹配'12' – 2013-04-24 08:13:42

+0

謝謝你。也許有些關於正則表達式的更多信息: '^'說它在行首,'(\ d +)'確保一個數字跟在'search.index.'後面。 – 2013-04-24 08:18:01

1

我不認爲你應該去做,但...
如果你可以做一個多行搜索(無論如何你必須在這裏),唯一的辦法是向後讀取文件。所以首先,吃一切都用.*(om nom nom)(如果你能使點全部匹配,(?:.|\s)*,如果你不能)。現在匹配你的模式search\.index\.(\d+)。你想在一行的開頭匹配這個模式:(?:^|\n)(希望你沒有使用一些瘋狂的格式,不使用\n作爲新的行字符)。

所以......

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

的數量應該是第一個匹配的小組。 (Test in JavaScript

PS:我不知道groovy,所以很抱歉,如果它完全不合適。

編輯:
這也應該工作:

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

謝謝你的非常快的回覆! (?:^ | \ n)search \ .index \。(\ d +)'(因爲完整版本給了一個StackOverflowError),我試着用一個稍微改動的版本來試用你的正則表達式。看起來像它的作品!只需要針對我的目的進行一些調整。 非常感謝(答案+解釋)! – 2013-04-24 08:01:25

+0

P.S.如果我有更多的代表,我會提高你的答案:D – 2013-04-24 08:25:03

+0

@Dreamonic比任何東西都更適合信息。我發現有趣的是,你可以用一個正則表達式來「黑客」系統; – Loamhoof 2013-04-24 08:31:32

1

試試這個作爲你的表情:

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

然後用Groovy你可以得到你的結果:

matcher[0][0] 

Here is an explanation page.

+0

這不會匹配任何東西,因爲它不是多行模式。如果它匹配(如果'search.index.1 = author:dc.contributor。*'在第一行),它將返回「'search.index.1'」,而不是該組搜索的號碼 – 2013-04-24 08:17:14

+0

由於某種原因,該鏈接到groovy.codehaus.org已被破壞。較新的鏈接http://docs.groovy-lang.org/latest/html/api/org/codehaus/groovy/runtime/DefaultGroovyMethods.html似乎表明一堆正則表達式是「棄用」...仍然在尋求一個明確的答案。 – MarkHu 2017-02-03 19:05:26

相關問題