正则表达式 - 如何交换不同行中的两个表达式?
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|
正则表达式模式匹配单个管道 |
,然后跨行捕获所有内容,直到命中 msgstr
的第一个实例。替换进行交换,管道和 msgstr
交换位置,它们之间捕获的内容不变。
编辑:
我的回答假设您正在以全点模式进行正则表达式替换,其中 .*
跨行匹配。如果不是,则改用以下模式:
Find: \|([\s\S]*?)msgstr
Replace: msgstr|
注意:这个答案是针对原始问题的,自从我发布这个答案以来,OP 已经发生了巨大的变化。
替换 /^(translate .*):\|$/
=> :msgstr
然后替换所有 /^msgstr\b/
=> |
我不确定我们是否理解您的问题。
你能扩展你的例子吗?
编辑:我来晚了,你能测试一下吗:
Search: /^(translate\b[^:]*:)([^\n]*)\n(.*)msgstr/gmsU
Replace: mgstr\n
一个选项是使用 4 个捕获组并在替换中切换组 4 和 2
^(.*)(\|.*)(\n(?:(?!msgstr).*\n)*)(msgstr)
^
字符串开头
(.*)
捕获 组 1,匹配任意字符 0+ 次
(\|.*)
捕获 组 2 从最后一次出现的 |
到组 2 中字符串的末尾
(\n(?:(?!msgstr).*\n)*)
捕获组3,匹配所有不以msgstr
开头的行
(msgstr)
捕获 组 4,匹配 msgstr
替换为
我是 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|
正则表达式模式匹配单个管道 |
,然后跨行捕获所有内容,直到命中 msgstr
的第一个实例。替换进行交换,管道和 msgstr
交换位置,它们之间捕获的内容不变。
编辑:
我的回答假设您正在以全点模式进行正则表达式替换,其中 .*
跨行匹配。如果不是,则改用以下模式:
Find: \|([\s\S]*?)msgstr
Replace: msgstr|
注意:这个答案是针对原始问题的,自从我发布这个答案以来,OP 已经发生了巨大的变化。
替换 /^(translate .*):\|$/
=> :msgstr
然后替换所有 /^msgstr\b/
=> |
我不确定我们是否理解您的问题。 你能扩展你的例子吗?
编辑:我来晚了,你能测试一下吗:
Search: /^(translate\b[^:]*:)([^\n]*)\n(.*)msgstr/gmsU
Replace: mgstr\n
一个选项是使用 4 个捕获组并在替换中切换组 4 和 2
^(.*)(\|.*)(\n(?:(?!msgstr).*\n)*)(msgstr)
^
字符串开头(.*)
捕获 组 1,匹配任意字符 0+ 次(\|.*)
捕获 组 2 从最后一次出现的|
到组 2 中字符串的末尾
(\n(?:(?!msgstr).*\n)*)
捕获组3,匹配所有不以msgstr
开头的行
(msgstr)
捕获 组 4,匹配msgstr
替换为