3

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)\"(.*?)\"(?<!\\\")が、さらに複雑になります。1 行に文字列タイプが混在すると問題が発生し始めます。

_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)(?<!\\)\"(.*?)\"(?<!\\\")はほぼ機能しますが、最初に含めるとは考えていなかった失敗したテスト ケースがもう 1 つあります。

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

1 に答える 1

2

前の一致で消費されるように、実際には_Tandの部分を一致させることができます。L

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

否定的な後読みも短くしました。

正規表現101のデモ

于 2013-10-01T20:19:26.377 に答える