如何仅替换找到的文本的一部分?

Posted

技术标签:

【中文标题】如何仅替换找到的文本的一部分?【英文标题】:How to replace only part of found text? 【发布时间】:2012-10-21 06:53:19 【问题描述】:

我有一个文件,其中包含一些逗号分隔的名称和一些逗号分隔的帐号。 名称将始终类似于 Dow, John 和类似于 012394,19862 的数字。

使用 Notepad++ 的“正则表达式查找”功能,我想用管道 | 替换数字之间的逗号。

基本上:

turn:  Dow,John      into:  Dow,John
       12345,09876          12345|09876
       13568,08642          13568|08642

我一直在使用[0-9],查找逗号,但我无法让它正确地留下数字的最后一位并替换只是逗号

有什么想法吗?

【问题讨论】:

感谢您提出这个问题,因为我有完全相同的问题,但不知道如何措辞! ?????? 【参考方案1】:

使用这个正则表达式

(\d),(\d)

替换成

$1|$2

\1|\2

【讨论】:

@Blender 可以做同样的事情 这实际上将 "$1|$2" 替换为文本中的内联 - 就像它没有将 $1 解析为我想要的预期字符串。 @Fake.It.Til.U.Make.It 啊,现在可以了。感谢您的回答,尽管我已经将另一个标记为“答案”,因为我使用了那个并且首先让它为我工作。【参考方案2】:

(?<=\d), 应该可以工作。奇怪的是,这仅在我使用全部替换时才有效,但在我使用替换单时无效。作为替代方案,您可以使用(\d), 并替换为$1|

【讨论】:

我不相信 Notepad++ 支持 LookaheadLookbehind 断言。 @Nick 实际上,确实如此。我有 NP++ 并且这有效(找到匹配项),但只有在我使用全部替换时才会替换它们。如果我尝试逐个替换它们,它们将保持不变。 我相信你,我只是听说过。我以前没有使用过 NP++ 的正则表达式。 我很惊讶 Replace 和 Replace All 之间的区别 - 这绝对值得记住。【参考方案3】:

搜索 ([0-9]), 并将其替换为 \1|。这行得通吗?

【讨论】:

啊,好像可以了,谢谢!我正在尝试 [0-9] 并将其替换为 `\1|',但这不起作用,但是像您在此处所做的那样添加括号效果很好。再次感谢! 为什么我们需要括号? @Patrick 在正则表达式中,括号创建一个捕获组,告诉解析器捕获组内的部分,以便它可以用于替换。 这似乎也适用于 TextPad。例如:查找 ([0-9]),([a-z]) 并替换 \1|\2 括号在正则表达式术语中称为“分组反向引用”。 ()()() - 在搜索中可以访问替换为 \1 \2 \3 :)【参考方案4】:

关于仅替换部分匹配项的一般想法

为了替换匹配的一部分,您需要 1) 使用正则表达式模式中的捕获组并反向引用替换模式中保留的组值,或 2) 环视,或 3) \K运算符丢弃左侧上下文。

所以,如果你有一个像a = 10 这样的字符串,并且你想用500 替换a = 之后的数字,你可以

找到(a =)\d+并替换为\1500/$1500(如果你使用$n反向引用语法并且后面跟着一个数字,你应该用大括号括起来) 找到(?<=a =)\d+ 并替换为500(因为(?<=...) 是一种非消耗性正向后向模式,它匹配的文本不会添加到匹配值中,因此不会被替换) 找到a =\K\d+ 并替换为500(其中\K 使正则表达式引擎“忘记”文本与\K 位置匹配,使其类似于后视解决方案,但允许使用任何量词,例如a\h*=\K\d+ 将匹配a =,即使a= 之间有任何零个或多个水平空格。

当前问题解决方案

为了替换两个数字之间的任何逗号,您应该使用环视:

查找内容(?<=\d),(?=\d)替换为|

详情

(?<=\d) - 正向向后看,需要紧跟当前位置左侧的数字 , - 逗号 (?=\d) - 正向前瞻,需要紧跟当前位置右侧的数字。

查看带有设置的演示屏幕截图:

请参阅regex demo。

变化

查找内容(\d),(?=\d)替换为\1|

查找内容\d\K,(?=\d)替换为|

注意:如果有逗号分隔的单个数字,例如1,2,3,4 你不能使用(\d),(\d),因为这只会匹配奇数出现(参见what I mean)。

【讨论】:

以上是关于如何仅替换找到的文本的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

如何仅通过替换一些文本来更改 href 标签

突出显示文本区域内的文本

将部分文本与全文匹配并替换

正则表达式对文本的部分替换

如何仅在表格视图的文本最后一部分中添加页脚文本?

如何在文本中找到像“e3”这样的特殊标记并将它们替换为列表中的匹配数据?