Текст соответствия регулярному выражению не обрабатывается кавычкой (игнорируйте пробелы) - PullRequest
0 голосов
/ 07 апреля 2020

У меня следующий текст:

SELECT 
    U_ArrObjJson(
        s."Description", s."DateStart", sp.*
    ) as "Result" 
FROM "Supplier" s 
OUTER APPLY( 
    SELECT 
        U_ArrObjJson,
        'U_ArrObjJson(',
'                                             <- THE PROBLEM IS HERE
        U_ArrObjJson(
            p."Id", p."Description", p."Price"
        ) as "Products" 
    FROM "Products" p 
    WHERE p."SupplierId" = s."Id" 
) sp 

Что мне нужно сделать, это найти экземпляры функции U_ArrObj Json, которые не являются кавычками. В итоге я получаю следующее выражение:

(?<!\')\bU_ArrObjJson\b[\n\r\s]*[\(]+

Проблема в том, что последнее вхождение U_ArrObjJson обрабатывается одиночной кавычкой, но между кавычкой и экземпляром имени, который я ищу, есть пробелы и новые строки for.

Это выражение, которое мне нужно использовать с do tnet Regex в моем методе:

var matches = new Regex(@"(?<!\')\bU_ArrObjJson\b[\n\r\s]*[\(]+", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant).Matches(template);

Как изменить выражение, чтобы игнорировать предшествующие пробелы?

1 Ответ

1 голос
/ 07 апреля 2020

Поскольку регулярное выражение NET поддерживает Lookbehinds нефиксированной ширины, вы можете просто добавить \s* к Lookbehind:

(?<!\'\s*)\bU_ArrObjJson\s*\(+

Демо .

Примечания:

  • [\n\r\s] здесь можно заменить просто \s, поскольку последний соответствует любому символу пробела (включая EOL ). Таким образом, \n\r здесь избыточен.

  • Как указано Wiktor Stribiżew в комментариях, второй \b также является избыточным, поскольку имя функции либо следовать за пробелом или символом (. В обоих случаях неявно требуется граница слова.

  • Если вы на самом деле не хотите сопоставить имя функции, за которым следуют несколько символов (, вам, вероятно, следует также удалить + в конец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...