正则表达式查找文档段然后使用子正则表达式

时间:2017-08-28 05:02:55

标签: regex

给出如下的集合:

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

如果没有立即找到正确的标题,如何使其无法匹配。

2 个答案:

答案 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

答案 1 :(得分:-1)

这个简单的应该可以做到这一点

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

当您要查找具有特定NAME值的所有块时,在这种情况下,NAME:CaptureMe

对于您可以使用的修饰符,如(?s),请参阅this site

另外,。*?任何时候,懒惰都意味着什么。一旦找到下一个必需的块,它就会停止。