notepad++正则表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了notepad++正则表达式相关的知识,希望对你有一定的参考价值。
匹配包含指定数量字符的行的正则表达式怎能么写 比如匹配包含3个a的行,不匹配其它包含1个a,2个a,4个以上a的行
参考技术A 转义字符如:要使用
“\”
本身,
则应该使用“\\”
\t
Tab制表符
注:扩展和正则表达式都支持
\r
回车符CR
注:扩展支持,正则表达式不支持
\n
换行符LF
注:扩展支持,正则表达式不支持
.
匹配任意字符
^
其右边的表达式被匹配在行首。如:^A匹配以“A”开头的行
$
其左边的表达式被匹配在行尾。如:e$匹配以“e”结尾的行
Notepad++ 正则表达式组捕获语法
【中文标题】Notepad++ 正则表达式组捕获语法【英文标题】:Notepad++ RegeEx group capture syntax 【发布时间】:2012-01-02 01:38:17 【问题描述】:我有一个文本文件中的标签名称列表,我想在 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\)\)\)
【问题讨论】:
【参考方案1】:Ed 的响应显示了一种工作模式,因为 Notepad++ 不支持交替,但是您的问题的其余部分不能仅由正则表达式处理。正则表达式查找/替换方法无法实现您尝试做的事情。您想要的结果涉及无法用正则表达式表达的逻辑条件。 replace 方法所能做的就是重新排列项目并引用捕获的项目,但你不能告诉它使用“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
分别从原始文件读取并将其写入另一个文件。
另外请注意,我的示例代码会写回原始文件。出于测试目的,您可以将该路径更改为另一个文件,以免被覆盖。
【讨论】:
谢谢艾哈迈德,无论如何这可以使用 grep 之类的工具来完成吗? @kingrichard2005 我对 grep 不太熟悉,快速搜索似乎并没有发现这样的功能。我确实找到了一个名为 PowerGREP 的工具。它不是免费的,但他们提供了一个试用版和support extra processing capabilities,它将提供映射替换功能(他们的屏幕截图示例显示了一些 URL 编码的字符被替换)。不过,这种类型的功能编写起来并不难。我已经用 C# 的示例方法更新了我的帖子,这可能会对您有所帮助。 谢谢艾哈迈德,我最终手动重命名了标签,幸运的是没有太多。我会接受您的回答,因为我没有意识到仅使用正则表达式是不可能做到这一点的。感谢您的建议和替代示例。【参考方案2】:Bar bar bar - Notepad++ 认为你是野蛮人。
(已过时 - 请参阅下面的更新。)Notepad++ regex 中没有竖线 - 抱歉。我也每隔几个月就会忘记一次!
请改用 [123456]。
更新:抱歉,我没有仔细阅读;除了跳酒吧问题,@Ahmad 的定位 - 你不能做这样的映射替换。
更新:Notepad++ 版本 6 将正则表达式引擎更改为与 Perl 兼容的引擎,它支持“|”。 AFAICT,如果你有版本 5。,自动更新不会更新到 6。 - 你必须明确下载它。
【讨论】:
【参考方案3】:正则表达式搜索和替换
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 个备选方案是互斥的,因此只有一个会匹配。因此,只有一个 (?...)
子句会匹配,因此只有一个会插入文本。
【讨论】:
【参考方案4】:我推荐的最简单的方法是使用 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
【讨论】:
以上是关于notepad++正则表达式的主要内容,如果未能解决你的问题,请参考以下文章