2008-09-05 12 views

cevap

7

aşağıdaki Regex bir MatchEvaluator temsilci yardımıyla bir Regex desen içine desen gibi bir SQL dönüştürür. Köşeli parantez bloklarını doğru şekilde işler ve özel Regex karakterlerinden kaçar. Ayrıca özel bir kaçış karakteri LIKE '!%' ESCAPE '!' sözdizimi kullanılarak tanımlanmış durumda işlemek için aşağıdaki kodu kullanabilirsiniz Nathan-Baulch çözümüyle @ ek olarak

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); 
    }); 
-1

Regexp::Wildcards adlı Perl modülünü buldum. Onu portlamayı deneyebilir veya Perl.NET'i deneyebilirsiniz. Kendine bir şeyler yazabileceğini hissediyorum. (C# bilmiyorum çünkü genel olarak konuşmak) Yukarıdaki örnekten

2

, böyle sürekli saldırıya uğrar:

Molası o ayrı GİBİ '...' tarafından, koydu. .. adete bir dizi içine. . * ile altını çizmektedir. tarafından tespit edilmeyen % işaretleri yerine, ve bu durumda [Cı-P] arsen düzenli ifade doğrudan çevirir.

Dizi parçalarını bir boruyla arkaya birleştirin ve sonucu parantez içine alın ve standart normal bitler.

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

Buradaki en önemli şey verileri kaçabilir tüm yolların dikkatli olmaktır ve hangilerinin normal ifadeler çevirmek joker:

sonuç olurdu.

% becomes .* 
_ becomes . 
+0

Dikkat edilmesi gereken bir şey, eğer sql benzeri desen \ içeriyorsa, o zaman bu ifadeden kaçmak istersiniz. Regex.Escape burada yardımcı olur – mrwaim

3

.

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); 
    } 
İlgili konular