我在文本文件中有一个标签名称列表,我想在Notepad ++中使用“查找和替换”进行操作,它们列出如下:
MyLabel_01
MyLabel_02
MyLabel_03
MyLabel_04
MyLabel_05
MyLabel_06
我想在Notepad ++中将它们重命名为以下内容:
Label_A_One
Label_A_Two
Label_A_Three
Label_B_One
Label_B_Two
Label_B_Three
我在Notepad ++的替换对话框中使用的正则表达式捕获标签名称如下:
((MyLabel_0)((1)|(2)|(3)|(4)|(5)|(6)))
我想按如下方式替换每个捕获组:
\1 = Label_
\2 = A_One
\3 = A_Two
\4 = A_Three
\5 = B_One
\6 = B_Two
\7 = B_Three
我的问题是Notepad ++没有注册上面的正则表达式的语法。当我在替换对话框中点击计数时,它返回0次。不确定语法中有什么问题。是的,我确保选择了正则表达式单选按钮。感谢帮助。
更新:
试图逃避括号,仍然无效:
\(\(MyLabel_0\)\((1\)|\(2\)|\(3\)|\(4\)|\(5\)|\(6\)\)\)
答案 0 :(得分:5)
Ed的响应显示了一种工作模式,因为Notepad ++不支持交替,但是单独使用regex无法解决其余问题。使用正则表达式查找/替换方法无法实现您的目标。您期望的结果涉及无法在正则表达式中表达的逻辑条件。您可以使用替换方法重新排列项目并参考捕获的项目,但您不能告诉它使用“A”表示值1-3,“B”表示4-6。此外,您不能分配这样的占位符。它们实际上是您反向引用的捕获组。
要达到您展示的结果,您需要编写一个小程序,以便检查捕获的值并执行相应的替换。
编辑:以下是如何在C#中实现此目的的示例
var numToWordMap = new Dictionary<int, string>();
numToWordMap[1] = "A_One";
numToWordMap[2] = "A_Two";
numToWordMap[3] = "A_Three";
numToWordMap[4] = "B_One";
numToWordMap[5] = "B_Two";
numToWordMap[6] = "B_Three";
string pattern = @"\bMyLabel_(\d+)\b";
string filePath = @"C:\temp.txt";
string[] contents = File.ReadAllLines(filePath);
for (int i = 0; i < contents.Length; i++)
{
contents[i] = Regex.Replace(contents[i], pattern,
m =>
{
int num = int.Parse(m.Groups[1].Value);
if (numToWordMap.ContainsKey(num))
{
return "Label_" + numToWordMap[num];
}
// key not found, use original value
return m.Value;
});
}
File.WriteAllLines(filePath, contents);
您应该可以轻松使用它。也许您可以下载LINQPad或Visual C# Express来执行此操作。
如果您的文件太大,这可能是一种效率低下的方法,在这种情况下,您可以使用StreamReader
和StreamWriter
从原始文件中读取并分别将其写入另一个文件。
另请注意,我的示例代码会写回原始文件。出于测试目的,您可以将该路径更改为另一个文件,以免被覆盖。
答案 1 :(得分:4)
酒吧吧 - Notepad ++认为你是一个野蛮人。
(已废弃 - 请参阅下面的更新。)Notepad++ regex中没有竖条 - 抱歉。我也每隔几个月忘记一次!
请改用[123456]。
更新:抱歉,我没有仔细阅读;除了barhopping问题,@ Ahmad的现场 - 你不能做那样的映射替换。
更新:Notepad ++的第6版将正则表达式引擎更改为与Perl兼容的引擎,它支持“|”。 AFAICT,如果您的版本为5. ,则自动更新不会更新为6. - 您必须明确下载它。
答案 2 :(得分:0)
正则表达式搜索和替换
MyLabel_((01)|(02)|(03)|(04)|(05)|(06))
与
Label_(?2A_One)(?3A_Two)(?4A_Three)(?5B_One)(?6B_Two)(?7B_Three)
适用于记事本6.3.2
最外面的一对括号用于分组,它们限制了第一次交替的范围;不确定是否可以省略它们但包括它们使范围清晰。该模式搜索固定字符串,后跟两位数字对中的一个。 (前导零可以被分解并放在固定的字符串中。)每个数字对都用圆括号包裹,以便捕获。
在替换表达式中,子句(?4A_Three)
表示如果捕获组4匹配某些内容,则插入文本A_Three
,否则不插入任何内容。同样适用于其他条款。由于6个替代品是互斥的,因此只有一个匹配。因此,只有一个(?...)
子句匹配,因此只有一个将插入文本。
答案 3 :(得分:-2)
我建议最简单的方法是使用AWK。如果您使用的是Windows,请在那里查找mingw32预编译的二进制文件以供免费下载(它将被称为gawk)。
BEGIN {
FS = "_0";
a[1]="A_One";
a[2]="A_Two";
a[3]="A_Three";
a[4]="B_One";
a[5]="B_Two";
a[6]="B_Three";
}
{
printf("Label_%s\n", a[$2]);
}
在Windows上执行如下:
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