regex - 正则表达式 - 如何在不同的行中交换两个表达式?
问题描述
我是 Regex 的新手,但我想在两条不同的行中交换两个表达式。这是代码:
translate italian ch1_a20cefa7:|
# "..."
msgstr "..."
我想换成:
translate italian ch1_a20cefa7:msgstr
# "..."
| "..."
正如你所看到的,|
已经与下面的msgstr
部分交换了。我该怎么做?此外,我应该在多行中应用它,有时|
您可以在前面找到其他字母或字符。我在想这个:
([|].*)
对于第一部分,但后来我不知道如何找到msgstr
(它永远不会改变)。
编辑:
这是我正在谈论的代码的另一个示例。
translate italian ch1_669664cb:| mc
# "Hey."
msgstr "Hey."
translate italian ch1_177d3eb2:| mc
# "What are you doing?"
msgstr "What are you doing?"
translate italian ch1_25d98ea6:| m p_1a
# "I'm in charge of the breakfast, remember?"
msgstr "I'm in charge of the breakfast, remember?"
translate italian ch1_7ae83e04:|
# "Oh, that's right."
msgstr "Oh, that's right."
我希望它像这样交换:
translate italian ch1_669664cb:msgstr
# "Hey."
| mc "Hey."
translate italian ch1_177d3eb2:msgstr
# "What are you doing?"
| mc"What are you doing?"
translate italian ch1_25d98ea6:msgstr
# "I'm in charge of the breakfast, remember?"
| m p_1a"I'm in charge of the breakfast, remember?"
translate italian ch1_7ae83e04:msgstr
# "Oh, that's right."
|"Oh, that's right."
如您所见,有时前面有东西,|
但有时没有。
解决方案
一种选择是使用 4 个捕获组并在替换中切换组 4 和 2
^(.*)(\|.*)(\n(?:(?!msgstr).*\n)*)(msgstr)
^
字符串的开始(.*)
捕获组 1,匹配任何字符 0+ 次(\|.*)
捕获组 2从最后一次出现|
到组 2 中字符串的结尾(\n(?:(?!msgstr).*\n)*)
捕获组 3,匹配所有不以开头的行msgstr
(msgstr)
捕获第 4 组,匹配msgstr
用。。。来代替
$1$4$3$2
推荐阅读
- amp-html - AMP 等效于 onchange 窗口位置 URL
- javascript - 更改弹出窗口的位置?
- java - 根据阈值确定哪些数字范围被视为相等
- sql - 如何将一系列记录转换为 SQL 中该范围之后的记录值?
- php - 如何在 Laravel 7 中将注册服务单例传递给另一个注册服务的构造函数?
- oauth-2.0 - 无法从 SPA 前端 Web 应用程序的图形 api 获取照片
- format - 如何在 Visual Studio 中格式化(排列)C# 代码?
- sql - Oracle Execute Immediate 没有转义报价?
- arrays - 跨列和整列的数组公式?
- pine-script - Pine Script 中的交易/赢/输计数和盈利百分比?