我有一些来自编译器(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
引用进入前瞻以防止匹配路径可以在以后匹配,但我总是得到所有路径或非路径。
我理解前瞻很慢,但性能不是问题,因为我会在很长一段时间内手动运行此正则表达式。
答案 0 :(得分:1)
您可以使用否定前瞻来获得唯一匹配:
\.+\s((?:\/[a-z]+)+\/(?:include|lib)\/[a-z0-9_+-]+)(?![\s\S]*\1)
此处(?![\s\S]*\1)
是一个负向前瞻,以确保匹配的组#1不会存在于输入的其余部分中。 [\s\S]
匹配任何字符,包括换行符。