どのコードで使うに変換するにはSQLのような表現では正規表現のフライ?

StackOverflow https://stackoverflow.com/questions/47052

質問

いに変換するにはSQLのような声明への航空券と同等の正規表現する

LIKE '%this%'
LIKE 'Sm_th'
LIKE '[C-P]arsen'

どのプラットフォームに?

P.S.思います。Netフレームワーク(C#).

役に立ちましたか?

解決

以下の正規表現に変換しますSQLのようなパターンへの正規表現パターンを MatchEvaluator に限ります。正しく取り扱う角ブラケットブロック、エスケープ特別の正規表現文字です。

string regexPattern = Regex.Replace(
    likePattern,
    @"[%_]|\[[^]]*\]|[^%_[]+",
    match =>
    {
        if (match.Value == "%")
        {
            return ".*";
        }
        if (match.Value == "_")
        {
            return ".";
        }
        if (match.Value.StartsWith("[") && match.Value.EndsWith("]"))
        {
            return match.Value;
        }
        return Regex.Escape(match.Value);
    });

他のヒント

ま@ネイサン-Baulchソリューションのコードを使うことができます以下のものを取り扱う場合はカスタムの拡張文字の定義を使用 LIKE '!%' ESCAPE '!' 構文です。

   public Regex ConvertSqlLikeToDotNetRegex(string regex, char? likeEscape = null)
   {
        var pattern = string.Format(@"
            {0}[%_]|
            [%_]|
            \[[^]]*\]|
            [^%_[{0}]+
            ", likeEscape);

        var regexPattern = Regex.Replace(
            regex,
            pattern,
            ConvertWildcardsAndEscapedCharacters,
            RegexOptions.IgnorePatternWhitespace);

        regexPattern = "^" + regexPattern + "$";

        return new Regex(regexPattern,
            !m_CaseSensitive ? RegexOptions.IgnoreCase : RegexOptions.None);
    }

    private string ConvertWildcardsAndEscapedCharacters(Match match)
    {
        // Wildcards
        switch (match.Value)
        {
            case "%":
                return ".*";
            case "_":
                return ".";
        }

        // Remove SQL defined escape characters from C# regex
        if (StartsWithEscapeCharacter(match.Value, likeEscape))
        {
            return match.Value.Remove(0, 1);
        }

        // Pass anything contained in []s straight through 
        // (These have the same behaviour in SQL LIKE Regex and C# Regex)
        if (StartsAndEndsWithSquareBrackets(match.Value))
        {
            return match.Value;
        }

        return Regex.Escape(match.Value);
    }

    private static bool StartsAndEndsWithSquareBrackets(string text)
    {
        return text.StartsWith("[", StringComparison.Ordinal) &&
               text.EndsWith("]", StringComparison.Ordinal);
    }

    private bool StartsWithEscapeCharacter(string text, char? likeEscape)
    {
        return (likeEscape != null) &&
               text.StartsWith(likeEscape.ToString(), StringComparison.Ordinal);
    }

から、上の例は、攻撃ではこのような(私は一般では分かりませんC#):

破れている のように'...', を入れて、 ... 個入配列になります。代替エスケープ解除 % 標識による .*,べきます。, この場合の [C-P]arsen 翻訳に直接regex.

入配列の作品と一緒にパイプ、ラップの結果、括弧内は、標準正規表現ですね。

結果の連する情報を表示します

/^(.*this.*|Sm.th|[C-P]arsen)$/

最も重要なので注意が必要なすべてのエスケープできますが、データをワイルドカードを翻訳する正規表現オブジェクト

% becomes .*
_ becomes .

このPerlモジュールと呼ばれ Regexp::ワイルドカード.滞在ビザを取得することができポートもしてみたPerl.NET.思を書き込んだ。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top