正则表达式 - 如何交换不同行中的两个表达式?

Regex - How can I swap two expressions in different lines?

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

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

您可以在正则表达式模式下尝试以下查找和替换:

Find:    \|(.*?)msgstr
Replace: msgstr|

Demo

正则表达式模式匹配单个管道 |,然后跨行捕获所有内容,直到命中 msgstr 的第一个实例。替换进行交换,管道和 msgstr 交换位置,它们之间捕获的内容不变。

编辑:

我的回答假设您正在以全点模式进行正则表达式替换,其中 .* 跨行匹配。如果不是,则改用以下模式:

Find:    \|([\s\S]*?)msgstr
Replace: msgstr|

注意:这个答案是针对原始问题的,自从我发布这个答案以来,OP 已经发生了巨大的变化。

替换 /^(translate .*):\|$/ => :msgstr 然后替换所有 /^msgstr\b/ => |

我不确定我们是否理解您的问题。 你能扩展你的例子吗?

编辑:我来晚了,你能测试一下吗:

Search: /^(translate\b[^:]*:)([^\n]*)\n(.*)msgstr/gmsU
Replace: mgstr\n

演示:https://regex101.com/r/jZekRH/1

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

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

替换为


Regex demo