正则表达式匹配文本不带引号(忽略空格)

时间:2020-04-07 10:58:16

标签: c# regex

我有以下文字:

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_ArrObjJson函数实例。我最终得到以下表达式:

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

问题是U_ArrObjJson的最后一次出现是用单引号引起来的,但是引号和我要查找的名称实例之间存在空格和换行符。

在我的方法中,我需要在dotnet Regex中使用以下表达式:

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

如何修改表达式以忽略前面的空格?

1 个答案:

答案 0 :(得分:1)

由于.NET的正则表达式支持非固定宽度的Lookbehinds,因此您只需将\s*添加到Lookbehind:

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

Demo

注释:

  • [\n\r\s]在这里可以仅替换为\s,因为后者匹配任何空白字符(包括EOL)。因此,\n\r在这里是多余的。

  • 如注释中的Wiktor Stribiżew所示,第二个\b也是多余的,因为函数名称后面将带有空格或(字符。在这两种情况下,都必须隐含单词边界。

  • 除非您实际上要匹配后跟多个(字符的函数名,否则可能还应该在末尾删除+