我正在使用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 ++语法问题。所以我希望你们都能忍受我一点,并感谢所有的帮助:)
答案 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"
。