Я ищу регулярное выражение, чтобы соответствовать только строкам MBCS внутри проекта C++. Это строки, содержащиеся в двойных кавычках без спецификатора L"..."
или _T("...")
. В любой строке кода может быть несколько котировок. Строки могут содержать экранированные подстроки, которые не должны заканчивать совпадение. Вот несколько примеров:Regex, чтобы соответствовать нескольким строкам MBCS в любой строке
"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
У меня есть регулярное выражение, чем может обрабатывать все этот штраф с использованием отрицательного lookbacks (?<!#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("
Не можете вы подходите все из них, а затем отфильтровать те, которые начинаются с 'L' или' _T (' – Bergi
Если ваши строки хорошо сформированы, я бы извлечь каждый' (?: L | _T \ s * \ (\ s *)? "(?: [^ \"] + | \\ ") *" "и затем проверить, имеет ли префикс перед открывающей цитатой. – tripleee
Да, это определенно Я думал, был ли простой способ придумать правильное регулярное выражение, но это выглядит сложнее и труднее, поскольку я запускаю его через некоторые реальные файлы. – Kyle