RegEx模式匹配允许句点

时间:2016-11-23 18:15:17

标签: c# sql-server regex

我在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

2 个答案:

答案 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个或多个字母。

编辑:只需阅读问题的第二段,并注意到您无法更改模式。