2017-08-28 83 views
0

給定一組類似如下:正則表達式查找文件的段,然後用正則表達式子

START:ITEM 
SUBTAG:Value 
OTHERSUBTAG:SUBTAG:Value 
NAME:CaptureMe 
END:ITEM 

START:ITEM 
MISCSTUFF:SUBTAG:Value 
OTHERMISC:SUBTAG:Value 
SOMETAG:SUBTAG:Value 
NAME:IgnoreMe 
ENDINGTAGS: 
END:ITEM 

我將如何使用正則表達式來找到每個集合,只匹配它是否包含一個特定的「NAME」的價值?

爲了說明起見,「START」和「END」標籤之間可以有任意數量的子標籤。

這是我正在使用的正則表達式,但問題是如果它不匹配它的「START」「END」對,它將移動到下一個並選擇。

START:TITLE\n(?!NAME)(.|\n|)*?(?:NAME:\s*(?!IgnoreMe).*)(.|\n|)*?END:TITLE 

如果它沒有立即找到正確的標題,我該如何使它無法匹配。

+1

什麼是TITLE? – CinCout

+0

重複捕捉組將只捕獲最後一場比賽。 –

回答

2

正則表達式應該是這樣的:

(?s)START:ITEM\b((?:(?!START:ITEM).)*?\bNAME:(CaptureMe|IgnoreMeNot).*?)END:ITEM 

說明:

(?s) 
START:ITEM\b 
(?: 
    ((?!START:ITEM).)*?    # negative lookahead: 
            # read lazily characters while there is no START:ITEM ahead 
    \bNAME:(CaptureMe|IgnoreMeNot) # capture only names CaptureMe and IgnoreMeNot 
    .*?        # read lazily characters until you get to the END:ITEM 
) 
END:ITEM 

看看regex101.com

+0

如果通過'NAME'(例如'FIRSTNAME')完成一行行,則不會捕獲錯誤行:https://regex101.com/r/ytI12n/6 – Mistalis

+0

@Mistalis不夠公平。像https://regex101.com/r/ytI12n/7 –

-1

這個簡單的人應該做的伎倆

(?s)START:ITEM.*NAME:CaptureMe.*?END:ITEM 

當你正在尋找所有具有特定名稱值的塊,在這種情況下,名稱:CaptureMe

對於改性劑可以使用,像請參考this site

此外,*(S?)。 ?意味着任何時候,任何事情,懶洋洋地。一旦找到下一個需要的塊,它就會停止。

+0

一樣添加一個邊界\ b我真的很想知道爲什麼這個答案沒有理由被downvoted ... –