我在SQL中使用CLR
程序集进行RegEx
模式匹配。我的组装非常简单。我相信,我试图找到错误数据的模式不允许使用期限。但是,CLR-based UDF
未返回包含句点的数据。
我知道找到无效数据的一个解决方案可能是更新模式,但是,模式来自第三方XML Schema,因此我无法更改我正在使用的模式。
我一直在使用http://regexr.com/作为验证模式应该和不应该拾取哪些字符的方法。在下面的场景中,使用网站时模式的周期字符无效。
我是否遗漏了我的实施内容?
字符串数据: TEST. DATA
匹配的模式: '([A-Za-z] ?)*[A-Za-z]'
RegEx CLR类方法:
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static bool RegExMatch(string pattern, string matchString)
{
if (string.IsNullOrEmpty(matchString) || string.IsNullOrEmpty(pattern))
return false;
Regex r1 = new Regex(pattern.TrimEnd(null));
return r1.Match(matchString.TrimEnd(null)).Success;
}
测试SQL代码:
SELECT 'TEST. DATA' AS TEST_STRING
, dbo.RegExMatch('([A-Za-z] ?)*[A-Za-z]', 'TEST. DATA') AS PatternMatch
答案 0 :(得分:0)
您提到模式来自第三方XML Schema 。正则表达式的味道与.NET非常相似,因此所有这些都可能在.NET中运行良好。但是,默认情况下锚定所有XML Schema模式,正则表达式不支持^
和$
作为字符串开头和字符串结尾锚点。
这意味着,您需要在测试的正则表达式中添加锚点,^
/ \A
以匹配字符串的开头,$
/ \z
为匹配字符串的结尾(最好是\z
)。
添加此支持的最安全方法是使用^(?:
和)$
封闭模式。
答案 1 :(得分:0)
如果受试者的模式类似于TEST。数据这样的模式应该可行。
^([A-Za-z]+)(\.)?\s?([A-Za-z]+)$
目前,模式必须以至少1个字母开头,后跟0或1个句点,后跟1个或多个空格字符,后跟1个或多个字母。
编辑:只需阅读问题的第二段,并注意到您无法更改模式。