【问题标题】:Why is it that some regex match is not replaced one by one?为什么某些正则表达式匹配没有被一一替换?
【发布时间】:2020-12-11 00:40:22
【问题描述】:

我正在使用 notepad++ 和 akelpad 进行文本编辑。

示例文本:hello,this is a test.are you ready?

搜索:(?<=[a-z,.?! ])([,.?!])(?=[a-z])

替换为:\1

替换结果:hello, this is a test. are you ready?

只有当我全部替换它们时,它才能按预期工作,但是如果我单击替换按钮,则什么也没有发生。它导航到下一个匹配项,就像我点击查找一样。

refer to this screenshot

它发生在 npp 和 akelpad 中。为什么会发生这种情况,我应该尝试什么解决方案?

谢谢!

【问题讨论】:

  • 尝试点击“全部替换”。这可能是您的编辑器的问题,因为正则表达式很好。见:regex101.com/r/4E0mu1/1;它匹配正确
  • 只需使用([,.?!])(?=[A-Za-z])。或([a-z,.?! ][,.?!])(?=[a-zA-Z])
  • 我得到了同样的行为,可能是一个 Npp 错误。你可以向 Npp 的开发人员发出信号。
  • 谢谢大家的想法。无论如何,我得到了我想要的结果。但有时我需要进行最终检查,所以一次更换一个对我来说非常重要。我尝试了 Wiktor 的替代方案,这似乎是我目前可以尝试的最好的方法,尽管如果我可以使用后向 subex 并且只突出显示匹配项以获得更清晰的视图,我仍然会更开心。
  • @katovic 如果您不需要重叠匹配,则不需要后视。在这种情况下,您不需要。

标签: regex notepad++ regex-lookarounds


【解决方案1】:

看起来像一个错误,因为正则表达式很好。

Notepad++ 和其他类似编辑器中的所有类似问题都可以通过尽可能多地捕获来解决。

在您的情况下,您可以将后视转化为消费模式:

([a-z,.?! ][,.?!])(?=[a-zA-Z])
^^^^^^^^^^^^^^^^^^   

现在,当替换为 \1 时,您将获得所需的行为,即匹配值将附加一个空格。

演示:

【讨论】:

  • 好。也许它与使用后向正则表达式有关,我不知道为什么。也许是错误,也许这就是它的工作原理?
  • @katovic 这肯定是一个错误。 Replace 的重点是移动到匹配的位置(显示它在哪里),然后在再次按下时替换它并进入下一个匹配。
【解决方案2】:

如果这只是你想要的,试试这个....

查找内容:[,.]
替换为:$0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2020-07-29
    相关资源
    最近更新 更多