【问题标题】:Atom \K alternative when replacing text替换文本时的 Atom \K 替代
【发布时间】:2020-08-26 22:01:44
【问题描述】:

我的用例如下:我有一个 86,000 行长的文档。它出现了 5851 次管道符号。我需要将每 5 次出现的管道从 | 更改为现在的 ]|

我终于为我的用例找到了正确的正则表达式(?:(\d*|\D)*(\|)){9}\K。我知道这一点,因为我在这个例子中在Regex 101 构建了它。它的作用是只选择 nth 管道并允许我仅与该管道进行交互。

如果您增加/减少大括号中的数字,它会相应地移动。伟大的。万岁。

但是,atom.io(我的编辑)调用 \K 是无效的转义。请问原子的首选正则表达式是什么?甚至,有没有更好的方法来做到这一点?

【问题讨论】:

  • 您可以在替换中使用整个匹配 ^(?:[^|]*\|){3}[^|]*\| regex101.com/r/UiEmPD/1 或者如果您想用其他东西替换它,请捕获组中管道之前的部分并匹配最后一个管道regex101.com/r/c55dlx/1
  • 使用捕获组和反向引用,regex101.com/r/zvaJzN/1
  • 天啊,我们是如此接近!它几乎可以工作了。我的文档有 86,000 行长,每 6 个管道需要从 | 更改。到]|。这些没有考虑到这一点(因为我忘了说)。
  • 我现在已经编辑了原始问题。我很抱歉。我以为我可以从您的回答中倒退。但这正是它的本质:向后工作!
  • 因此,要替换第 5 个管道,请使用 ^((?:[^|\r\n]*\|){4}[^|\r\n]*)\| 并替换为 $1]|。或\1]|。它有效吗?见regex101.com/r/Azx3vT/1

标签: regex atom-editor


【解决方案1】:

这里的重点是\K 是一个运算符,它只是省略了到目前为止与当前匹配内存缓冲区匹配的文本。您可以在Keep The Text Matched So Far out of The Overall Regex Match 中阅读更多关于\K 的信息。

当您需要替换一些其他字符串或文本之前的内容时,您可以简单地使用capturing groupbackreference

你可以使用

查找内容^((?:[^|\r\n]*\|){4}[^|\r\n]*)\|
替换为\1]|

regex demo

详情

  • ^ - 行首
  • ((?:[^|\r\n]*\|){4}[^|\r\n]*) - 捕获组 1(与替换模式中的 \1 一起引用):
    • (?:[^|\r\n]*\|){4} - 四次出现
      • [^|\r\n]* - 除了|、CR 和 LF 之外的 0+ 个字符(CR 和 LF 是必需的,以免在下一行溢出)
      • \| - 管道字符(它在正则表达式中很特殊,因此被转义)
    • [^|\r\n]* - 除了|、CR 和 LF 之外的 0+ 个字符
  • \| - 将被匹配、使用和替换为替换模式的管道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多