将#include标记与正则表达式匹配

时间:2018-03-23 04:05:38

标签: c++ regex notepad++

我正在使用Notepad ++中的“查找和替换”功能,虽然我以前从未使用过正则表达式,但我没有看到任何其他方法来实现我的目标。我试图只选择两个特定字符,只在具有特定单词的行中。具体字词为#include,特定字符为<>

例如,如果我有#include <climits>,我想只匹配<>

如果我有template<class T>这样的行,我不想在该行上选择任何内容,因为该行中不包含#include

有什么建议吗?

编辑特异性: 我不太担心<字符,因为我认为我可以使用find和replace来修复它们,所以我只是要求我们在此时关注>字符。这是我正在尝试做的一个例子。目前我的.hpp文件之一包含:

#include "utility> //for std::swap (C++11)
#include "algorithm> //for std::swap (C++98)
#include "cstddef> //for std::size_t
#include "boost/config.hpp"

我想改成

#include "utility" //for std::swap (C++11)
#include "algorithm" //for std::swap (C++98)
#include "cstddef" //for std::size_t
#include "boost/config.hpp"

此代码的其他部分包含我根本不想更改的内容,尽管包含>字符:

template<class Alloc>
    class CompatAlloc
    {        // general case : be transparent    

我正在尝试保留包含引用本身,即<>">中包含的内容以及注释。因此,仅使用>替换<字符和适用的"字符,但仅限于以#include开头的行。

希望能让它变得更加清晰,抱歉让人感到困惑。我不是一个真正的程序员,只是想帮助一个朋友为Windows编译一些C ++软件,虽然它是用Linux编写的,所以它需要的许多包含文件都有很小的Visual C ++语法问题。所以我希望你们都能忍受我一点,并感谢所有的帮助:)

2 个答案:

答案 0 :(得分:1)

尝试此查找并替换:

<强>查找

public class Test {
    public int key;
    public int value;
    public Test father;
    public Test Sibling;`

    public Test(int item, int obj){
        this.key = item;
        this.value = obj;
    }

    public Test reAssignKey(int input) {
        key = input;
        return father;
    }

    public Test reAssignValue(int output){
        value = output;
        return Sibling;
    }

    public int remove(){
        this.reAssignKey(3).Sibling = new Test(3,10);
        return this.reAssignKey(3).Sibling.key;
    }
 }

<强>替换

#include\s+"([^>]+)>

请注意,代替#include "$1" ,某些正则表达式引擎使用$1作为第一个捕获组,在这种情况下,您将替换为:

\1

答案 1 :(得分:0)

要匹配<,您可以使用模式<。要仅匹配<之后的#include,您可以添加一个后视:(?<=#include )<。为了匹配>之后的#include <foo,您无法使用后视,因为他们通常不允许使用可变宽度(并且包含的​​名称具有)。如果您希望<的正则表达式对空格敏感(例如#include <foo>匹配),那么您就会遇到同样的问题。

由于这是一个搜索和替换,您可能不仅仅匹配<>,而是将其替换为使用捕获组的内容,例如如果您要将#include <foo>的所有实例替换为#include "foo"

^(\s*#include\s*)<([^>]*)>替换为\1 "\2"