1

SQL Server CHARINDEX関数のように機能するC#のSQL Server CLRがありますが、正規表現を使用できます。

[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最初の(index = )に一致し0ます。

于 2012-11-30T08:00:33.117 に答える