Notepad++ 正则表达式组捕获语法

     2023-03-11     14

关键词:

【中文标题】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++ 正则表达式反向引用语法 - \1 或 $1

】搜索/替换中的Notepad++正则表达式反向引用语法-\\\\1或$1【英文标题】:Notepad++RegexBackreferencesyntaxinSearch/Replace-\\1or$1搜索/替换中的Notepad++正则表达式反向引用语法-\\1或$1【发布时间】:2012-08-1119:31:13【问题描述】:我尝试使用No... 查看详情

无捕获组和命名组

...有两个功能可以对这个问题有所帮助。它们也都使用正则表达式扩展的通用语法,因此我们来看看第一个。Perl5对标准正则表达式增加了几个附加功能,Python的re模块也支持其中的大部分。选择一个新的单按键元字符或一个以""开... 查看详情

捕获组之前或捕获组之后的正则表达式,具有单个捕获组

】捕获组之前或捕获组之后的正则表达式,具有单个捕获组【英文标题】:RegexbeforecapturegroupORaftercapturegroup,withsinglecapturegroup【发布时间】:2020-10-3012:22:42【问题描述】:在BigQuery中,我只能有一个捕获组。这个正则表达式实现... 查看详情

通过正则表达式在 Notepad++ 中替换时如何使用条件

】通过正则表达式在Notepad++中替换时如何使用条件【英文标题】:HowtouseconditionalswhenreplacinginNotepad++viaregex【发布时间】:2016-09-0618:05:36【问题描述】:考虑以下正则表达式:([a-zA-Z])([a-zA-Z]?)/([a-zA-Z])([a-zA-Z]?)如果文字是:a/b捕获... 查看详情

具有不同量词的正则表达式捕获组

】具有不同量词的正则表达式捕获组【英文标题】:Regexcapturegroupwithdifferentquantifiers【发布时间】:2020-10-2204:35:50【问题描述】:我正在解析的文本包括捕获组前后以及捕获组内的星号。我已经确定解析捕获组的模式基本上是:... 查看详情

将排除捕获组的正则表达式

】将排除捕获组的正则表达式【英文标题】:Regexthatwillexcludeacapturegroup【发布时间】:2012-02-1717:39:07【问题描述】:我正在编写一个正则表达式,我需要捕获以“get”开头的复数字符串。例如getContacts和getBuildings应该匹配正则表... 查看详情

正则表达式 - 非捕获组返回所谓的非捕获组,,? [复制]

】正则表达式-非捕获组返回所谓的非捕获组,,?[复制]【英文标题】:regex-non-capturinggroupreturnsthesupposedlynon-capturedgroup,,?[duplicate]【发布时间】:2018-12-0400:09:29【问题描述】:这不是重复的……在我看来。我不是在问它的用处。... 查看详情

在正则表达式(Javascript)中分隔捕获组[重复]

】在正则表达式(Javascript)中分隔捕获组[重复]【英文标题】:Delimitcapturegroupinregex(Javascript)[duplicate]【发布时间】:2022-01-2201:22:33【问题描述】:我有以下正则表达式:/^https:\\/\\/([^\\.]+\\.)?youtube\\.com\\/watch\\?v=(.*)/这是匹配的yout... 查看详情

正则表达式 - 重复捕获组

】正则表达式-重复捕获组【英文标题】:Regex-RepeatingCapturingGroup【发布时间】:2017-09-1315:43:45【问题描述】:我试图弄清楚如何在以下url字符串中的comma-separated值上重复捕获组:id=1,2;name=user1,user2,user3;city=Oakland,SanFrancisco,Seattle;zi... 查看详情

什么是正则表达式“独立非捕获组”?

】什么是正则表达式“独立非捕获组”?【英文标题】:Whatisaregex"independentnon-capturinggroup"?【发布时间】:2010-09-0805:01:20【问题描述】:来自Java6Pattern文档:特殊构造(非捕获)(?:X)   X,作为非捕获组…(?&gt;X)   X... 查看详情

嵌套捕获组如何在正则表达式中编号?

】嵌套捕获组如何在正则表达式中编号?【英文标题】:Howarenestedcapturinggroupsnumberedinregularexpressions?【发布时间】:2010-11-2118:51:11【问题描述】:对于正则表达式应如何处理嵌套括号的捕获行为,是否有定义的行为?更具体地说... 查看详情

正则表达式进阶

捕获组捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或手动命名的组里,以供后面引用。表达式说明(Expression)普通捕获组,将子表达式Expression匹配的内容保存到以数字编号的组里(?<name>Expression)... 查看详情

.NET 正则表达式中的“组”和“捕获”有啥区别?

】.NET正则表达式中的“组”和“捕获”有啥区别?【英文标题】:What\'sthedifferencebetween"groups"and"captures"in.NETregularexpressions?.NET正则表达式中的“组”和“捕获”有什么区别?【发布时间】:2011-03-2005:56:45【问题描... 查看详情

非捕获组不在正则表达式中工作

】非捕获组不在正则表达式中工作【英文标题】:Non-capturinggroupnotworkinginRegex【发布时间】:2012-09-0606:34:07【问题描述】:使用正则表达式,我想匹配以下字符串:January25Jan25我正在分别捕获月份和日期部分,但如果有完整的月... 查看详情

为啥这个正则表达式需要一个捕获组来匹配?

】为啥这个正则表达式需要一个捕获组来匹配?【英文标题】:Whyisacapturegroupneededforthisregextomatch?为什么这个正则表达式需要一个捕获组来匹配?【发布时间】:2021-12-3122:16:12【问题描述】:理想情况下,我希望不必求助于捕获... 查看详情

正则表达式中的命名捕获组

】正则表达式中的命名捕获组【英文标题】:namedcapturegroupinregex【发布时间】:2011-10-2618:12:22【问题描述】:我需要正则表达式的帮助来从以下字符串中捕获数字和连字符:“一些文字和东西200-1234EM一些其他东西”它也可以不... 查看详情

正则表达式组捕获[重复]

】正则表达式组捕获[重复]【英文标题】:RegexGroupCapture[duplicate]【发布时间】:2019-12-1900:21:31【问题描述】:我有一封标准电子邮件,我希望从中提取某些详细信息。电子邮件中有这样的行:<strong>Name:</strong>JohnSmith所... 查看详情

Java 正则表达式捕获组索引

】Java正则表达式捕获组索引【英文标题】:Javaregexcapturinggroupsindexes【发布时间】:2013-05-0705:30:22【问题描述】:我有以下行,typeName="ABC:xxxxx;";我需要获取单词ABC,我写了如下代码sn-p,Patternpattern4=Pattern.compile("(.*):");matcher=pattern... 查看详情