【问题标题】:Regex - How can I swap two expressions in different lines?正则表达式 - 如何在不同的行中交换两个表达式?
【发布时间】:2020-04-03 19:58:47
【问题描述】:

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

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

【问题讨论】:

  • 在其他用户已经回答问题后,您不应该大幅改变您的问题。
  • 来自regex tag info:“由于正则表达式尚未完全标准化,所有带有此标签的问题还应包含一个指定适用的编程语言或工具的标签。”
  • @TimBiegeleisen 抱歉,但我没有“大幅度”改变我的问题,我只是澄清了我从一开始就要求的内容。来自我的原始问题:“[...] 有时在 | 前面,您可以找到其他字母或字符。”。您的回答很好,但未完成,抱歉!

标签: regex atom-editor


【解决方案1】:

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

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

替换为

$1$4$3$2

Regex demo

【讨论】:

    【解决方案2】:

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

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

    Demo

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

    编辑:

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

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

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

    【讨论】:

    • 嗨!谢谢你的回答。我试图复制你的表达,但它不起作用。如果有帮助,我正在使用 Atom!
    • 您应该告诉我们您使用的是什么正则表达式工具/语言。我的回答在演示中确实有效,并且也适用于 Notepad++ 之类的工具,可能还有大多数 IDE。
    • 是的,很抱歉。我将 Atom 用于 RegEx,在您的演示中按我的意愿工作,但在我的工具中却没有。正如我所说,我是这方面的新手,我应该在 Atom 上做点什么吗?
    • 是的...您是否在正则表达式替换中启用了 DOT ALL 模式?检查我更新的答案,寻找可能在 Atom 中工作而无需更改任何内容的替代方案。
    • 很抱歉再次打扰您,您的编辑非常完美,唯一的问题是我想交换| 之后的其余行。正如我所说,因为有时在其他行中可能会有其他一些字母或字符,我也想交换它们。示例:translate italian ch1_a20cefa7:| mc 再次抱歉,打扰您了!
    【解决方案3】:

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

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

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

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

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

    【讨论】:

    • 我扩展了我的问题,您现在应该更好地理解它!对不起,如果我没有澄清自己。
    猜你喜欢
    • 1970-01-01
    • 2014-06-08
    • 2020-08-02
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多