正则表达式和多行PO文件

时间:2018-10-12 19:36:40

标签: regex multiline po

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

以下是这些行:

  

msgid“”

     

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

     

“要在新BOM表中继续使用此Job,请更新   很多和到期。\ n“

     

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

     

msgstr“”

     

“自生产开始,成品的BOM已更改   添加。\ n“

     

“要在新BOM表中继续使用此Job,请更新   很多和到期。\ n“

     

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

我需要更改双引号,但仅在msgid部分上。这些双引号应更改为小于<和大于>符号,因此结果如下:

  

msgid <>

     

     

<要在新BOM表中继续使用此Job,请更新   很多和到期。\ n>

     

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

     

msgstr“”

     

“自生产开始,成品的BOM已更改   添加。\ n“

     

“要在新BOM表中继续使用此Job,请更新   很多和到期。\ n“

     

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

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

我使用此模式进行搜索:

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

要替换的模式:

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

哪个可以工作,但不完全是我想要的。它仅复制最后一行,而不复制上面的两行。我做错了事,但不知道那是什么。

建议?

1 个答案:

答案 0 :(得分:0)

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

单个正则表达式解决方案如下

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

请参见regex demo

详细信息

  • (?s)-与 .相同,当启用时会匹配换行符
  • (?:\G(?!^(?<=.))|^msgid)-行(^)的开头,然后是msgid,或(|)上次成功匹配(\G(?!^(?<=.)))的结尾
  • (?:(?!^msg(?:id|str))[^"])*?
  • \K-匹配重置运算符,匹配缓冲区被清除
  • "-一个"
  • ((?:(?!^msg(?:id|str))[^"])*?)-捕获组1:
    • (?:(?!^msg(?:id|str))[^"])*?-除"以外的其他任何不超过msgidmsgstr字符序列的字符,任何0或更多,但尽可能少在一行的开头
  • "-一个"

enter image description here