如何仅替换找到的文本的一部分?
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++ 支持Lookahead
和 Lookbehind
断言。
@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)。
【讨论】:
以上是关于如何仅替换找到的文本的一部分?的主要内容,如果未能解决你的问题,请参考以下文章