正则表达式:替换双引号(已解决),但仅在包含特殊字符串的行中(子条件未解决)
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 日更新:几乎用两种略有不同的方法解决了(谢谢大家!)还有什么没有解决..
- @Thefourthbird的解决方案(见答案1)
^(?!.?"ENGLISH")[^"]".*(跳过)(F)|("")([ ^<>]?)("")(?=(?:[^>]?(?:<|$)))
近乎完美,只是缺少 HTML 部分中的匹配项。 HTML csv 文件中的部分始终用双引号括起来,并且可能有换行符 (LF)。 https://regex101.com/r/x5shnx/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)
匹配该行的其余部分并跳过
|
或
("")([^<>]*?)("")(?=(?:[^>]*?(?:<|$)))
您当前的模式
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 日更新:几乎用两种略有不同的方法解决了(谢谢大家!)还有什么没有解决..
- @Thefourthbird的解决方案(见答案1) ^(?!.?"ENGLISH")[^"]".*(跳过)(F)|("")([ ^<>]?)("")(?=(?:[^>]?(?:<|$)))
近乎完美,只是缺少 HTML 部分中的匹配项。 HTML csv 文件中的部分始终用双引号括起来,并且可能有换行符 (LF)。 https://regex101.com/r/x5shnx/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)
匹配该行的其余部分并跳过|
或("")([^<>]*?)("")(?=(?:[^>]*?(?:<|$)))
您当前的模式