使用前瞻只获得唯一的匹配

时间:2015-09-29 10:23:12

标签: regex

我有一些来自编译器(gcc)的调试输出,列出了它使用的所有包含目录:

......... /usr/include/boost/serialization/traits.hpp
....... /usr/include/boost/serialization/split_member.hpp
....... /usr/include/boost/serialization/base_object.hpp
........ /usr/include/boost/serialization/force_include.hpp
........ /usr/include/boost/serialization/void_cast_fwd.hpp
....... /usr/include/boost/serialization/wrapper.hpp

超过3000行,所有这些都看起来像这样。我想获得一个加载的依赖项列表,当然,每个路径一个。类似的东西:

/usr/include/boost/
/usr/local/include/log4cplus/

到目前为止,我做到了这一点:https://regex101.com/r/gM3aW4/1

\.+\s((?:\/[a-z]+)+)\/(include|lib)\/([a-z0-9\+]+)

它正确匹配并为您提供路径,但重复列出它们。我已经看到有人在此使用超前表达式(?! ... )。我试过"把" \1-3引用进入前瞻以防止匹配路径可以在以后匹配,但我总是得到所有路径或非路径。

我理解前瞻很慢,但性能不是问题,因为我会在很长一段时间内手动运行此正则表达式。

1 个答案:

答案 0 :(得分:1)

您可以使用否定前瞻来获得唯一匹配:

\.+\s((?:\/[a-z]+)+\/(?:include|lib)\/[a-z0-9_+-]+)(?![\s\S]*\1)

此处(?![\s\S]*\1)是一个负向前瞻,以确保匹配的组#1不会存在于输入的其余部分中。 [\s\S]匹配任何字符,包括换行符。

RegEx Demo