使用 Autohotkey 替换多行正则表达式
Multiline Regex replacement with Autohotkey
我似乎无法理解正确的正则表达式!
我的目标
- 在所选文本块的每一行中添加 2 个空格
我的背景
- 我使用的一些降价工具需要每行末尾有 2 个空格才能正确管理列表等
- 如果一个文件被多次编辑,我不想以超过 4 个空格结尾的行结束
- 一个文本块可以是一行,一段,整个文件内容如编辑器所示
- 我在 Notepad++ 中有某种宏可以解决这个问题,但我想对 Autohotkey 做同样的事情以使其独立于编辑器
我的例子
----
# 2020-03-17
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.
In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,
到目前为止我的片段
; CTL+SHIFT+F12
^+F12::
Clipboard = ; Empty the clipboard so that ClipWait has something to detect
SendInput, ^c ; Copy selected text
ClipWait
OutputText := ""
Loop, parse, Clipboard, `n, `r
{
OutputText .= RegExReplace(A_LoopField,"m)^(.*) *$"," `r`n")
}
SendRaw % OutputText
return
我的问题
在循环时忽略的字符、我尝试匹配的内容和我尝试用其替换组的内容之间,我最终得到的行和空格比需要的多得多。
当前输出
----
# 2020-03-17
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.
In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,
期望的输出
----
# 2020-03-17
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.
In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,
输出中的行太多,因为发送命令因回车 returns 而混乱,反正那里不需要。我真的不知道为什么会这样,而且我也懒得去找出原因,因为无论如何这种方法都不好。
而且您的缩进也变得一团糟,因为您的文本编辑器会根据上一行自动添加缩进。
但是无论如何,发送这样的(长)输入绝不是一个好主意。
使用剪贴板,只需发送 ctrl+v 即可立即可靠地粘贴到文本中。
这是在末尾添加空格的另一种方法的示例:
inp := "
(
----
# 2020-03-17
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.
In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,
)"
Loop, Parse, inp, `n, `r
OutputText .= (A_LoopField = "" ? "" : RTrim(A_LoopField) " ") "`n"
Clipboard := OutputText
SendInput, ^v
三进制 A_LoopField = "" ? "" : RTrim(A_LoopField) " "
returns 如果该行为空则为真,然后两个空格不会添加到末尾。
我认为这就是你所做的行为。
RTrim
用于 trim 末尾的任何尾随空格(或制表符),因此我们一定会得到我们想要的两个。
当然,在每一行的末尾我们添加一个换行符 `n
.
此外,您的 Regex 方法也很好,起初我觉得它不合时宜,但是,这是另一种方法。我想这会更有效率,尽管你必须使用非常大的输入 and/or 慢速硬件才能产生任何有意义的差异哈哈。
我似乎无法理解正确的正则表达式!
我的目标
- 在所选文本块的每一行中添加 2 个空格
我的背景
- 我使用的一些降价工具需要每行末尾有 2 个空格才能正确管理列表等
- 如果一个文件被多次编辑,我不想以超过 4 个空格结尾的行结束
- 一个文本块可以是一行,一段,整个文件内容如编辑器所示
- 我在 Notepad++ 中有某种宏可以解决这个问题,但我想对 Autohotkey 做同样的事情以使其独立于编辑器
我的例子
----
# 2020-03-17
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.
In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,
到目前为止我的片段
; CTL+SHIFT+F12
^+F12::
Clipboard = ; Empty the clipboard so that ClipWait has something to detect
SendInput, ^c ; Copy selected text
ClipWait
OutputText := ""
Loop, parse, Clipboard, `n, `r
{
OutputText .= RegExReplace(A_LoopField,"m)^(.*) *$"," `r`n")
}
SendRaw % OutputText
return
我的问题
在循环时忽略的字符、我尝试匹配的内容和我尝试用其替换组的内容之间,我最终得到的行和空格比需要的多得多。
当前输出
----
# 2020-03-17
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.
In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,
期望的输出
----
# 2020-03-17
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.
In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,
输出中的行太多,因为发送命令因回车 returns 而混乱,反正那里不需要。我真的不知道为什么会这样,而且我也懒得去找出原因,因为无论如何这种方法都不好。
而且您的缩进也变得一团糟,因为您的文本编辑器会根据上一行自动添加缩进。
但是无论如何,发送这样的(长)输入绝不是一个好主意。
使用剪贴板,只需发送 ctrl+v 即可立即可靠地粘贴到文本中。
这是在末尾添加空格的另一种方法的示例:
inp := "
(
----
# 2020-03-17
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.
In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,
)"
Loop, Parse, inp, `n, `r
OutputText .= (A_LoopField = "" ? "" : RTrim(A_LoopField) " ") "`n"
Clipboard := OutputText
SendInput, ^v
三进制 A_LoopField = "" ? "" : RTrim(A_LoopField) " "
returns 如果该行为空则为真,然后两个空格不会添加到末尾。
我认为这就是你所做的行为。
RTrim
用于 trim 末尾的任何尾随空格(或制表符),因此我们一定会得到我们想要的两个。
当然,在每一行的末尾我们添加一个换行符 `n
.
此外,您的 Regex 方法也很好,起初我觉得它不合时宜,但是,这是另一种方法。我想这会更有效率,尽管你必须使用非常大的输入 and/or 慢速硬件才能产生任何有意义的差异哈哈。