【问题标题】: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],查找逗号,但我无法让它正确地留下数字的最后一位并替换只是逗号

有什么想法吗?

【问题讨论】:

  • 感谢您提出这个问题,因为我有完全相同的问题,但不知道如何措辞! ??????

标签: regex notepad++ replace


【解决方案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/${1}500(如果你使用$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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 2013-04-23
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    相关资源
    最近更新 更多