我在文本文件中有一个标签名称列表,我想在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 StreamReader
和StreamWriter
原始文件读取并将其写入另一个文件.
另请注意,我的示例代码会写回原始文件.出于测试目的,您可以将该路径更改为另一个文件,以免被覆盖.
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 StreamReader
和StreamWriter
原始文件读取并将其写入另一个文件.
另请注意,我的示例代码会写回原始文件.出于测试目的,您可以将该路径更改为另一个文件,以免被覆盖.