正则表达式匹配任何行上的多个MBCS字符串

时间:2013-10-01 20:11:46

标签: c++ regex string

我正在寻找一个正则表达式来匹配C ++项目中的MBCS字符串。这些是包含在双引号中的字符串,没有L"..."_T("...")说明符。任何代码行都可以有多个引号。字符串可以包含不应结束匹配的转义子字符串。以下是一些例子:

"This is a MBCS string"; // "This is a MBCS string" match
_T("This is maybe a unicode string"); // no match
L"This is a unicode string"; // no match
"These both" + "should match"; // "These both" and "should match" match
"This is a \"quoted\" string"; // "This is a \"quoted\" string" match

我有一个正则表达式而不是使用负回顾(?<!#include )(?<!_T\()(?<!\\)(?<!L)\"(.*?)\"(?<!\\\")来处理所有这些问题,但它变得更复杂了。它开始出现在一行混合字符串类型的问题。

_T("Maybe this") + "is a match"; // "is this" match but instead would match ") + "
do_something(_T("This doesn't match")) + do_something("but this does match"); // "but this does match" match but instead it matches ")) + do_something("

如何使_T("")L""字词上的正则表达式不匹配,但仍然匹配它们以获取结束引用而不将其作为匹配项返回?

编辑:这个正则表达式(?:_T\(\"[^\"]+\"\).*?|L\"[^\"]+\".*?)*(?<!#include )(?<!_T\()(?<!L)(?<!\\)\"(.*?)\"(?<!\\\")几乎完成了这项工作,但是还有一个测试用例失败,我原本没想过要包含它。

_T("don't match this") + _T("or this"); // shouldn't match anything, matches ") + _T("

1 个答案:

答案 0 :(得分:2)

您实际上可能会匹配_TL部分,以便在之前的匹配中使用它们:

(?:_T\(\"[^\"]+\"\).*?|L\"[^\"]+\".*?)?(?<!#include )(?<!_T\(|L|\\)\"(.*?)\"(?<!\\\")

我也缩短了负面看法。

regex101 demo