正则表达式:替换双引号(已解决),但仅在包含特殊字符串的行中(子条件未解决)

Regex: Replace double double quotes (solved), but only in lines that contain a special string (subcondition unsolved)

1.问题总结

我有一个 csv 文件,我想用印刷引号替换文本中的普通引号。

这很难(因为 HTML 也包括在内),但我同时创建了一个很好的正则表达式,它做的是正确的事情:在三个“捕获组”中,我找到了左引号和右引号和里面的文字。更换就小菜一碟了

2。正则表达式引擎

我可以使用 Notepad++ (boost) 或 PCRE2 comaptible 的正则表达式引擎,出于开发和测试目的我使用了 https://regex101.com

3。我遇到的困难和无法解决的问题,在这里我需要你的帮助:

我想添加一个子条件,以便仅在某些行中找到引号中的文本,想通过语言识别这些行,例如英语或法语(另请参见屏幕截图中的示例)。

Screenshot of a sample

表示语言的字符串始终在要查找的文本之前的同一行中,但是只有引号中的文本(主要条件)应该在匹配子条件后被标记,这样我就可以替换他们。

csv文件大概有几千条记录,最坏的情况我也可以手动替换。但我很确定这也应该通过正则表达式工作。

4.我试过的

环顾四周和非捕获组的不同方法并没有使我达到预期的结果 - 可能是因为我并不真正理解它们是如何工作的。

可在此处找到示例:https://regex101.com/r/ketwwm/1

例子可以在这里找到,它只包含正则表达式来匹配和标记没有搜索子条件的(三个)组:

("")([^<>]*?)("")(?=(?:[^>]*?(?:<|$)))

希望社区中的任何人都可以提供帮助? (希望我没有错过任何东西,这是我第一次 post )

5. 2022 年 3 月 18 日更新:几乎用两种略有不同的方法解决了(谢谢大家!)还有什么没有解决..

  1. @Thefourthbird的解决方案(见答案1) ^(?!.?"ENGLISH")[^"]".*(跳过)(F)|("")([ ^<>]?)("")(?=(?:[^>]?(?:<|$)))

近乎完美,只是缺少 HTML 部分中的匹配项。 HTML csv 文件中的部分始终用双引号括起来,并且可能有换行符 (LF)。 https://regex101.com/r/x5shnx/1

  1. @Wiktor Stribiżew 的解决方案(见下方评论) ^.?"ENGLISH".?\K("")([^<>]?)("")(?=(?:[^> ]?(?:<|$)))

与 HTML 部分中的匹配相同,见上文。加号:如果文本中出现多个这样的条目,则不匹配双引号中的文本。 https://regex101.com/r/I4NTdb/1

Screenshot (only to illustrate)

如果要匹配多个场合,可以使用SKIP匹配所有不以FRENCH开头的行:

^"(?!FRENCH")[^"]*".*(*SKIP)(*F)|("")([^<>]*?)("")(?=(?:[^>]*?(?:<|$)))

模式匹配:

  • ^ 字符串开头
  • "字面匹配
  • (?!FRENCH") 否定的 lookhead,断言不是 FRENCH" 直接在右边
  • [^"]*" 匹配除 " 之外的任何字符并匹配 "
  • .*(*SKIP)(*F) 匹配该行的其余部分并跳过
  • |
  • ("")([^<>]*?)("")(?=(?:[^>]*?(?:<|$)))您当前的模式

Regex demo