1

我有一个 C# 中的 SQL Server CLR,其功能类似于 SQL Server CHARINDEX 函数,但允许使用正则表达式。

[SqlFunction]
public static SqlInt32 RegExIndex(SqlChars input, SqlString pattern, SqlInt32 beginning)
{
    Regex regex = new Regex(pattern.Value, Options);
    Match match = regex.Match(new string(input.Value), beginning.Value);
    return match.Index;
}

在测试中,我发现以下应该返回 1 时返回 3:

select dbo.RegExIndex('test', 't', 1)

以下在应该返回 4 时返回 0:

select dbo.RegExIndex('test', 't', 4)

我想也许开始参数是零基数,但是当它应该返回 1 时也返回 0:

select dbo.RegExIndex('test', 't', 0)

关于我可能做错了什么的任何想法?

谢谢!

这是基于提供的答案的更新代码:

[SqlFunction]
public static SqlInt32 RegExIndex(SqlChars input, SqlString pattern, SqlInt32 beginning)
{
    Regex regex = new Regex(pattern.Value, Options);
    return beginning.Value > input.Value.Length ? 0
        : !regex.Match(new string(input.Value), beginning.Value < 1 ? 0 : beginning.Value - 1).Success ? 0
        : regex.Match(new string(input.Value), beginning.Value < 1 ? 0 : beginning.Value - 1).Index + 1;
}
4

1 回答 1

2

您正在使用此Regex.Match重载:

public Match Match(
    string input,
    int startat
)

其中startat参数(您的beginning参数)是开始搜索的从零开始的字符位置。此外,Match.Index属性(您的match.Index值)也是找到捕获的子字符串的原始字符串中从零开始的起始位置

这意味着,在您的所有测试中,您都会得到正确的结果:

select dbo.RegExIndex('test', 't', 1)

匹配最后一个t(index = 3);

select dbo.RegExIndex('test', 't', 4)

不匹配任何东西;

select dbo.RegExIndex('test', 't', 0)

匹配第一个t(索引 = 0)。

于 2012-11-30T08:00:33.117 回答