给出如下的集合:
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
如果没有立即找到正确的标题,如何使其无法匹配。
答案 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
答案 1 :(得分:-1)
这个简单的应该可以做到这一点
(?s)START:ITEM.*NAME:CaptureMe.*?END:ITEM
当您要查找具有特定NAME值的所有块时,在这种情况下,NAME:CaptureMe
对于您可以使用的修饰符,如(?s),请参阅this site
另外,。*?任何时候,懒惰都意味着什么。一旦找到下一个必需的块,它就会停止。