【问题标题】:RegEx and multiline PO files正则表达式和多行 PO 文件
【发布时间】:2019-03-18 01:36:22
【问题描述】:

我正在尝试在 Notepad++ 中创建一个正则表达式,只是一个简单的搜索和替换。

以下几行:

msgstr ""

" CONSUMPTION_PLAN_ERR|成品的 BOM 已更改 因为添加了生产。\n"

" 要继续将此作业与新 BOM 一起使用,请更新 批次和到期时间。\n"

"以前的生产记录将不会更新。\n"

msgstr ""

" 自生产以来,成品的 BOM 已更改 已添加。\n"

" 要继续将此作业与新 BOM 一起使用,请更新 批次和到期时间。\n"

"以前的生产记录将不会更新。\n"

我需要更改双引号,但仅限于 msgid 部分。这些双引号应该改为小于的符号,所以结果如下:

msgid

msgstr ""

" 自生产以来,成品的 BOM 已更改 已添加。\n"

" 要继续将此作业与新 BOM 一起使用,请更新 批次和到期时间。\n"

"以前的生产记录将不会更新。\n"

无论需要更改多少行,我都需要一个匹配上述多行示例的正则表达式模式。

我用这个模式搜索:

msgid ""\r\n("(.+?)"\r\n){1,}

并且要替换这个模式:

msgid <>\r\n<\2>\r\n

这在一定程度上有效,但并不完全符合我的要求。它只复制最后一行,而不是上面的两行。我做错了什么,但不知道是什么。

建议?

【问题讨论】:

    标签: regex multiline po


    【解决方案1】:

    您可以使用正则表达式,但它并不简单,而且效率不高。更有效的解决方案是编写解析器,或者使用更灵活的编程语言来使用至少两个正则表达式的组合:一个会提取块,第二个会替换引号。

    单个正则表达式解决方案看起来像

    查找内容(?s)(?:\G(?!^(?&lt;=.))|^msgid)(?:(?!^msg(?:id|str))[^"])*?\K"((?:(?!^msg(?:id|str))[^"])*?)"
    替换为&lt;$1&gt;

    请参阅regex demo

    详情

    • (?s) - 与 . 匹配换行符 时相同
    • (?:\G(?!^(?&lt;=.))|^msgid) - 一行的开始(^)然后msgid,或(|)上一个成功匹配的结束(\G(?!^(?&lt;=.))
    • (?:(?!^msg(?:id|str))[^"])*?
    • \K - 匹配重置运算符,匹配缓冲区被清除
    • " - 一个"
    • ((?:(?!^msg(?:id|str))[^"])*?) - 捕获组 1:
      • (?:(?!^msg(?:id|str))[^"])*? - 任何 0 或更多,但尽可能少,出现除 " 以外的任何字符,不会在行首开始 msgidmsgstr 字符序列
    • " - 一个"

    【讨论】:

    • @Green_goblin 如果这回答了您的问题,请将其标记为已接受(上/下投票箭头下的复选标记)。见stackoverflow.com/help/someone-answers
    • 完成,对不起,我是新来的。
    猜你喜欢
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多