2013-03-18 37 views
0

使用正則表達式,(我使用的是PCRE的Autohotkey)如何匹配ini文件的部分?我不需要獲得個人密鑰 - 只是部分塊。正則表達式:返回ini節作爲字符串

我想出了這個,只要找到的部分後面有一個部分,它就會匹配,但如果它是最後一部分,它就會失敗。

iniregex := "ms)(?<=^\[keys\]).*(?=^\[)"

例子,我想要得到的部分,[keys]的全部內容,而排除了意見,並忽略空行(它應該捕捉test=2,然而,但不包括在該行的註釋:

[settings] 
settings=0 
;settings=1 

[keys] 
test=0 
;test=1 
test=2 ;comment 
test=3 
[nextsection] 
this section has an empty and should be caught. 

there is an empty line after this line, and it should be caught, too. 

    eof 

I found this,但我不知道放在哪裏尋求節的名稱。

回答

1

你不能用一個單一的正則表達式實現這一目標。

什麼,你可以使用基於你的引證這個正則表達式來提取[keys]部分不包括[keys]標籤做:

/^(?<=\[keys\]\r\n)(?:(?!^\[).)*(?=\r\n)/ms 

之後,您可以使用this regexp對於所提取的片段排除的意見/空行:

/^[^;\s][^;\r\n]*/gm 
+0

第一個正則表達式讓我像我想要的部分,但第二個似乎並沒有排除評論。 – bgmCoder 2013-03-18 03:13:22

+0

在第一個正則表達式中,如何在'[keys]'之後和下一個'['? – bgmCoder 2013-03-22 21:53:23

+0

@BGM你想用下面的換行符排除整個'[keys]'字符串嗎?你有什麼樣的換行符? '\ r \ n','\ n','\ r'? – speakr 2013-03-23 17:12:18

1

從你的鏈接的問題,你會把追捧區NA我在這裏:

(?ms)^\[keys](?:(?!^\[[^]\r\n]+]).)*

我不認爲你將能夠剝離出來的意見在同一個正則表達式作爲捕獲,但是。你必須在第二步中做到這一點。

如果在[keys]之後沒有部分,則您的正則表達式會失敗,因爲您需要爲下一部分放置「0或更多」類型的量詞。喜歡的東西:

iniregex := "ms)(?<=^\[keys\]).*(?:(?=^\[))?"

+1

我想如果你只是讓尾隨前瞻是可選的,那麼你最終會捕獲整個文件的其餘部分,而不會停留在下一節。也許'(?=^\ [| \ z)'而不是? – rra 2013-03-18 02:17:55

相關問題