在 Notepad++ 中是否有一个正则表达式能够将“::”右侧的内容移动到“::”左侧但没有撇号?

In Notepad++ is there a regex capable of taking what's to the right of "::" and moving it to the left of "::" but without the apostrophe?

简而言之,我有一个包含一堆英文缩写的文本文件,其中 3 个在下面,一个是在我意识到大约 80 行的难度之前完成的。

::I'd've
::I'll
::ain't
dont::don't

通常我使用 RegEx 通过 n++ 修改我的大部分文本文件,但发现在这种情况下缺少它。我基本上是想把 :: 右边的东西移到 :: 左边,然后删除撇号 ',忽略那些已经完成的。

Idve::I'd've
Ill::I'll
aint::ain't
dont::don't

我仍处于 learning/using 正则表达式的早期阶段,我几乎无法胜任 AutoHotkey 以外的任何编程,如果你称之为真正的编程(至少在我的水平)。 regex+notepad++ 是否能够满足此请求,或者我想使用 Python 或 Bash 之类的东西来修改文本文件?

^[^:]*$ 是我使用过的唯一正则表达式,我在网上找到了一个,因为我不知道如何解决 NOT : 的问题(添加 ::到该行的开头)但在那里偶然发现仅将其应用于不包含 :: 的行。

谢谢!

如果您知道每行可以有多少个撇号的限制,您可以创建一个正则表达式来匹配行首的 ::,然后是除换行字符之外的任意数量的字符, :',捕获到一个组中,然后是一个 ',并在可选的非捕获组序列中重复此子模式。然后,替换为对组的反向引用。使用 $nn 语法,您可能有多达 99 个组。

这是一个正则表达式,每行最多支持 9 个撇号:

^::([^:\r\n']+)'(?:([^:\r\n']+)')?(?:([^:\r\n']+)')?(?:([^:\r\n']+)')?(?:([^:\r\n']+)')?(?:([^:\r\n']+)')?(?:([^:\r\n']+)')?(?:([^:\r\n']+)')?([^:\r\n']+)?

替换为[=16=]

详情

  • ^ - 行首
  • :: - :: 字符串
  • ([^:\r\n']+)' - 第 1 组 (</code>):除 <code>:、CR、LF、' 以外的一个或多个字符,然后是 '字符匹配
  • (?:([^:\r\n']+)')? - 可选的非捕获组匹配
    • ([^:\r\n']+)' - 第 2 组 (</code>):除 <code>:、CR、LF、'
    • 之外的一个或多个字符
    • ' - 一个'
  • (?:([^:\r\n']+)')? - 可选非捕获组中的组 3 (</code>)</li> <li><code>(?:([^:\r\n']+)')? - 可选非捕获组中的组 4 (</code>)</li> <li><code>(?:([^:\r\n']+)')? - 可选非捕获组中的组 5 (</code>)</li> <li><code>(?:([^:\r\n']+)')? - 可选非捕获组中的组 6 (</code>)</li> <li><code>(?:([^:\r\n']+)')? - 可选非捕获组中的组 7 (</code>)</li> <li><code>(?:([^:\r\n']+)')? - 可选非捕获组中的组 8 (</code>)</li> <li><code>([^:\r\n']+)? - 一个可选的捕获组 9 (</code>):除 <code>:、CR、LF、'.[=79= 之外的一个或多个字符]

注意[=48=]指的是整个匹配值。