当前位置:  开发笔记 > 编程语言 > 正文

Notepad ++ RegeEx组捕获语法

如何解决《Notepad++RegeEx组捕获语法》经验,为你挑选了1个好方法。

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

Ahmad Mageed.. 5

Ed的响应显示了一种工作模式,因为Notepad ++不支持交替,但是单独使用regex无法解决其余问题.使用正则表达式查找/替换方法无法实现您的目标.您期望的结果涉及无法在正则表达式中表达的逻辑条件.您可以使用替换方法重新排列项目并参考捕获的项目,但您不能告诉它使用"A"表示值1-3,"B"表示4-6.此外,您不能分配这样的占位符.它们实际上是您反向引用的捕获组.

为了达到您已经显示的结果,您需要编写一个小程序,以便检查捕获的值并执行适当的替换.

编辑:这是一个如何在C#中实现这一目标的示例

var numToWordMap = new Dictionary();
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来执行此操作.

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

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



1> Ahmad Mageed..:

Ed的响应显示了一种工作模式,因为Notepad ++不支持交替,但是单独使用regex无法解决其余问题.使用正则表达式查找/替换方法无法实现您的目标.您期望的结果涉及无法在正则表达式中表达的逻辑条件.您可以使用替换方法重新排列项目并参考捕获的项目,但您不能告诉它使用"A"表示值1-3,"B"表示4-6.此外,您不能分配这样的占位符.它们实际上是您反向引用的捕获组.

为了达到您已经显示的结果,您需要编写一个小程序,以便检查捕获的值并执行适当的替换.

编辑:这是一个如何在C#中实现这一目标的示例

var numToWordMap = new Dictionary();
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来执行此操作.

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

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

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有