我在文本文件中有一个标签名称列表,我想在记事本中使用“查找和替换”进行操作,它们列出如下:
MyLabel_01 MyLabel_02 MyLabel_03 MyLabel_04 MyLabel_05 MyLabel_06
我想在记事本中将它们重命名为以下内容:
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)))
我想按如下方式替换每个捕获组:
\1 = Label_ \2 = A_One \3 = A_Two \4 = A_Three \5 = B_One \6 = B_Two \7 = B_Three
我的问题是记事本没有注册上面的正则表达式的语法.当我在替换对话框中点击计数时,它返回0次.不确定语法中有什么问题.是的,我确保选择了正则表达式单选按钮.感谢帮助.
更新:
试图逃避括号,仍然没有工作:
\(\(MyLabel_0\)\((1\)|\(2\)|\(3\)|\(4\)|\(5\)|\(6\)\)\)
解决方法
Ed的响应显示了一种工作模式,因为记事本不支持交替,但是单独使用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分别从原始文件中读取并将其写入另一个文件.