首页 > 解决方案 > 正则表达式 - 如何在不同的行中交换两个表达式?

问题描述

我是 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."

如您所见,有时前面有东西,|但有时没有。

标签: regexatom-editor

解决方案


一种选择是使用 4 个捕获组并在替换中切换组 4 和 2

^(.*)(\|.*)(\n(?:(?!msgstr).*\n)*)(msgstr)
  • ^字符串的开始
  • (.*)捕获组 1,匹配任何字符 0+ 次
  • (\|.*)捕获组 2从最后一次出现|到组 2 中字符串的结尾
  • (\n(?:(?!msgstr).*\n)*)捕获组 3,匹配所有不以开头的行msgstr
  • (msgstr)捕获第 4 组,匹配msgstr

用。。。来代替

$1$4$3$2

正则表达式演示


推荐阅读