Notepad ++ RegeEx组捕获语法

时间:2011-11-19 19:55:42

标签: regex notepad++ replace

我在文本文件中有一个标签名称列表,我想在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\)\)\)

4 个答案:

答案 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);

您应该可以轻松使用它。也许您可以下载LINQPadVisual C# Express来执行此操作。

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

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

答案 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