首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegEx和多行PO文件

RegEx和多行PO文件
EN

Stack Overflow用户
提问于 2018-10-12 19:36:39
回答 1查看 250关注 0票数 1

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

这些线路如下:

“msgid” “自添加生产以来,CONSUMPTION_PLAN_ERR|The成品的BOM已更改。\n” “若要在新的BOM中继续使用此职务,请更新批次和费用。\n” “以前的生产记录将不会更新。\n” msgstr "“ “成品的BOM自添加后已更改。\n” “若要在新的BOM中继续使用此职务,请更新批次和费用。\n” “以前的生产记录将不会更新。\n”

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

msgid <> < CONSUMPTION_PLAN_ERR|The changed‘s BOM自从生产added.\n>以来发生了变化 <若要在新的BOM中继续使用此作业,请更新批量和expiries.\n> <以前的生产记录不会是updated.\n> msgstr "“ “成品的BOM自添加后已更改。\n” “若要在新的BOM中继续使用此职务,请更新批次和费用。\n” “以前的生产记录将不会更新。\n”

无论需要更改多少行,我都需要一个与上面这样的多行示例相匹配的regex模式。

我使用这个模式搜索:

代码语言:javascript
复制
msgid ""\r\n("(.+?)"\r\n){1,}

这一模式取代了:

代码语言:javascript
复制
msgid <>\r\n<\2>\r\n

有点效果,但不是我想要的。它只复制最后一行,但不复制上面两行。我做错了什么,但不知道是什么。

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-12 20:44:50

您可以使用regex,但它并不简单,也不会有效。更有效的解决方案是编写解析器,或者使用更灵活的编程语言来使用至少两个regexp的组合:一个提取块,另一个替换引号。

一个regex解决方案看起来像

找到什么:(?s)(?:\G(?!^(?<=.))|^msgid)(?:(?!^msg(?:id|str))[^"])*?\K"((?:(?!^msg(?:id|str))[^"])*?)"

替换为:<$1>

regex演示

详细信息

  • (?s) -与.匹配
  • (?:\G(?!^(?<=.))|^msgid) -开始一行(^),然后是msgid,或者(|)上一次成功比赛的结束(\G(?!^(?<=.)))
  • (?:(?!^msg(?:id|str))[^"])*?
  • \K -匹配重置操作符,匹配缓冲区将被清除。
  • " -a "
  • ((?:(?!^msg(?:id|str))[^"])*?) -捕获组1:
    • (?:(?!^msg(?:id|str))[^"])*? -除了"以外,任何0或更多但尽可能少出现的字符都不会在行的开头启动msgidmsgstr字符序列。

  • " -a ".

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52785995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档