我有以下文字:
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);
如何修改表达式以忽略前面的空格?
答案 0 :(得分:1)
由于.NET的正则表达式支持非固定宽度的Lookbehinds,因此您只需将\s*
添加到Lookbehind:
(?<!\'\s*)\bU_ArrObjJson\s*\(+
Demo 。
注释:
[\n\r\s]
在这里可以仅替换为\s
,因为后者匹配任何空白字符(包括EOL)。因此,\n\r
在这里是多余的。
如注释中的Wiktor Stribiżew所示,第二个\b
也是多余的,因为函数名称后面将带有空格或(
字符。在这两种情况下,都必须隐含单词边界。
除非您实际上要匹配后跟多个(
字符的函数名,否则可能还应该在末尾删除+
。