Regex 记事本++;RegeEx组捕获语法

Regex 记事本++;RegeEx组捕获语法,regex,notepad++,replace,Regex,Notepad++,Replace,我在一个文本文件中有一个标签名列表,我想使用记事本++中的“查找和替换”进行操作,它们如下所示: MyLabel_01 MyLabel_02 MyLabel_03 MyLabel_04 MyLabel_05 MyLabel_06 \1 = Label_ \2 = A_One \3 = A_Two \4 = A_Three \5 = B_One \6 = B_Two \7 = B_Three C:\Users\Mydir>gawk -f test.awk awk.in Label_A_O

我在一个文本文件中有一个标签名列表,我想使用记事本++中的“查找和替换”进行操作,它们如下所示:

MyLabel_01
MyLabel_02
MyLabel_03
MyLabel_04
MyLabel_05
MyLabel_06
\1 = Label_
\2 = A_One
\3 = A_Two
\4 = A_Three
\5 = B_One
\6 = B_Two
\7 = B_Three
C:\Users\Mydir>gawk -f test.awk awk.in
Label_A_One
Label_A_Two
Label_A_Three
Label_B_One
Label_B_Two
Label_B_Three
我想在Notepad++中将它们重命名为以下名称:

Label_A_One
Label_A_Two
Label_A_Three
Label_B_One
Label_B_Two
Label_B_Three
((MyLabel_0)((1)|(2)|(3)|(4)|(5)|(6)))
我在记事本++的替换对话框中用于捕获标签名称的正则表达式如下所示:

Label_A_One
Label_A_Two
Label_A_Three
Label_B_One
Label_B_Two
Label_B_Three
((MyLabel_0)((1)|(2)|(3)|(4)|(5)|(6)))
我希望按如下方式替换每个捕获组:

MyLabel_01
MyLabel_02
MyLabel_03
MyLabel_04
MyLabel_05
MyLabel_06
\1 = Label_
\2 = A_One
\3 = A_Two
\4 = A_Three
\5 = B_One
\6 = B_Two
\7 = B_Three
C:\Users\Mydir>gawk -f test.awk awk.in
Label_A_One
Label_A_Two
Label_A_Three
Label_B_One
Label_B_Two
Label_B_Three
我的问题是Notepad++没有注册上面正则表达式的语法。当我在“替换”对话框中单击“计数”时,它返回0次。不确定语法中有什么错误。是的,我确保选中了正则表达式单选按钮。谢谢你的帮助

更新:

已尝试转义括号,但仍然无效:

\(\(MyLabel_0\)\((1\)|\(2\)|\(3\)|\(4\)|\(5\)|\(6\)\)\)

记事本++认为你是个野蛮人

(过时-请参阅下面的更新。)中没有竖线-抱歉。我每隔几个月也会忘记

请改用[123456]

更新:对不起,我读得不够仔细;除了跳酒吧的问题,@Ahmad的现场-你不能做这样的地图替换


更新:Notepad++版本6将正则表达式引擎更改为支持“|”的Perl兼容引擎。AFAICT,如果您有版本5,自动更新将不会更新到6。-您必须显式地下载它。

Ed的响应显示了一种工作模式,因为Notepad++不支持交替,但是剩下的问题不能由regex单独处理。使用regex查找/替换方法无法实现您尝试的操作。您想要的结果涉及无法用正则表达式表示的逻辑条件。使用replace方法所能做的就是重新排列项目并引用捕获的项目,但不能告诉它使用“A”表示值1-3,使用“B”表示值4-6。此外,您不能这样分配占位符。它们实际上是您正在反向引用的捕获组

要达到您显示的结果,您需要编写一个小程序,允许您检查捕获的值并执行适当的替换

编辑:下面是一个如何在C中实现这一点的示例#

var numToWordMap=newdictionary();
numToWordMap[1]=“一个”;
numToWordMap[2]=“A_Two”;
numToWordMap[3]=“A_三”;
numToWordMap[4]=“B_One”;
numToWordMap[5]=“B_Two”;
numToWordMap[6]=“B_三”;
字符串模式=@“\bMyLabel_Ud(\d+)\b”;
字符串文件路径=@“C:\temp.txt”;
string[]contents=File.ReadAllLines(文件路径);
for(int i=0;i
{
int num=int.Parse(m.Groups[1].Value);
if(numToWordMap.ContainsKey(num))
{
返回“标签”+numToWordMap[num];
}
//找不到密钥,请使用原始值
返回m.值;
});
}
writeAllines(文件路径、内容);
你应该能够很容易地使用它。也许你可以下载或者这样做

如果您的文件太大,这可能是一种低效的方法,在这种情况下,您可以分别使用
StreamReader
StreamWriter
读取原始文件并将其写入另一个文件


还要注意,我的示例代码会写回原始文件。出于测试目的,您可以将该路径更改为另一个文件,这样它就不会被覆盖。

我建议最简单的方法是使用AWK。如果您在Windows上,可以免费下载mingw32预编译二进制文件(称为gawk)

在Windows上执行以下操作:

MyLabel_01
MyLabel_02
MyLabel_03
MyLabel_04
MyLabel_05
MyLabel_06
\1 = Label_
\2 = A_One
\3 = A_Two
\4 = A_Three
\5 = B_One
\6 = B_Two
\7 = B_Three
C:\Users\Mydir>gawk -f test.awk awk.in
Label_A_One
Label_A_Two
Label_A_Three
Label_B_One
Label_B_Two
Label_B_Three

对的正则表达式搜索和替换

MyLabel_((01)|(02)|(03)|(04)|(05)|(06))

在记事本6.3.2上工作

最外层的一对括号用于分组,它们限制了第一次交替的范围;不确定是否可以省略它们,但将它们包括在内可以明确范围。该模式搜索后跟两个数字对之一的固定字符串。(前导零可以分解并放入固定字符串中。)每个数字对都用圆括号括起来,以便捕获


在替换表达式中,子句
(?4A_-Three)
表示,如果捕获组4匹配某个内容,则插入文本
A_-Three
,否则不插入任何内容。其他条款也是如此。由于这6个备选方案相互排斥,因此只有一个匹配。因此,只有一个
(?…)
子句匹配,因此只有一个将插入文本。

谢谢艾哈迈德,是否可以使用grep等工具来完成这项工作?@kingrichard2005我对grep不太熟悉,快速搜索它似乎并没有显示出这样的功能。我确实找到了一个名为PowerGREP的工具。这不是免费的,但他们提供了一个试用版,可以提供映射替换功能(他们的屏幕截图示例显示了一些URL编码的字符被替换)。不过,编写这种类型的功能并不难。我用C#更新了我的帖子,这可能会对你有所帮助。谢谢你,艾哈迈德,我最终手动重命名了标签,幸运的是没有太多。我会接受你的回答,因为我不知道仅仅用正则表达式是不可能做到这一点的。感谢您的建议和示例选择。