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

Regex 正则表达式-如何交换不同行中的两个表达式?,regex,atom-editor,Regex,Atom Editor,我对正则表达式很陌生,但我想交换两行中的两个表达式。 代码如下: translate italian ch1_a20cefa7:| # "..." msgstr "..." 我想换成: translate italian ch1_a20cefa7:msgstr # "..." | "..." 如您所见,|已与下面的msgstr部分交换。我怎么做? 此外,我应该在多行中应用此方法,有时在|前面可以找到其他字母或字符。 我在想: ([|].*),但我不知道如何找到msgstr(它永远不会改变

我对正则表达式很陌生,但我想交换两行中的两个表达式。 代码如下:

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

正如您所看到的,有时在
|
前面有一些东西,但有时没有。

您可以在regex模式下尝试以下查找和替换:

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

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

编辑:

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

Find:    \|([\s\S]*?)msgstr
Replace: msgstr$1|
注:此答案是针对原始问题给出的,自我发布此答案以来,OP已发生了显著变化。

替换
/^(翻译。*):\\\$/
=>
$1:msgstr
然后替换所有
/^msgstr\b/
=>
|

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

编辑:我迟到了,你能测试一下吗

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

演示:

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

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

$1$4$3$2

嗨!谢谢你的回答。我试着模仿你的表情,但没用。如果有帮助的话,我正在使用Atom!您应该告诉我们您使用的是什么正则表达式工具/语言。我的答案当然可以在演示中使用,也可以在记事本++和大多数IDE等工具中使用。是的,很抱歉。我正在使用Atom作为正则表达式,在您的演示中,它可以按照我的要求工作,但在我的工具中却不能。正如我所说,我在这方面是新手,我应该在Atom上做些什么吗?是的……你在你的正则表达式替换中启用了点所有模式了吗?请检查我的更新答案,以获得一个可能在Atom中工作而无需更改任何内容的替代方案。很抱歉再次打扰您,您的编辑非常完美,唯一的问题是我想在
|
之后交换该行的其余部分。正如我所说的,因为有时在其他行中可能会有一些其他字母或字符,所以我也想交换它们。示例:
再次翻译意大利语ch1_a20cefa7:| mc
,很抱歉打扰您!在其他用户已经回答您的问题后,您不应大幅更改您的问题。从:“由于正则表达式未完全标准化,因此所有带有此标记的问题还应包括一个指定适用编程语言或工具的标记。”@TimBiegeleisen抱歉,但我没有“大幅”更改我的问题,我只是简单地澄清了从一开始我所要求的。从我最初的问题:“[…]有时在
|
前面,你可以找到其他字母或字符。”。你的回答很好,但没有完成,对不起!我扩展了我的问题,你现在应该更好地理解它了!对不起,如果我没有澄清我自己。