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 来执行此操作。

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

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

【讨论】:

谢谢艾哈迈德,无论如何这可以使用 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++正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

在 Notepad++ 中用 \t 替换正则表达式

Notepad++ 利用正则表达式删除关键词所在行

Notepad++ 使用正则表达式

Notepad++ 正则表达式替换 - \1 不起作用?

notepad++ 正则表达式交换两个值

正则表达式应用案例 (notepad++中)