2010-07-25 9 views
6

Ich brauche einen Regex dynamisch zu bauen, um die angegebenen Keywords zu fangen, wieWie codiert man Strings für Regular Expression in .NET?

string regex = "(some|predefined|words"; 
foreach (Product product in products) 
    regex += "|" + product.Name; // Need to encode product.Name because it can include special characters. 
regex += ")"; 

Gibt es irgendeine Art von Regex.Encode, das dies tut?

Antwort

8

Sie können Regex.Escape verwenden. Zum Beispiel:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

public class Test 
{ 
    static void Main() 
    { 
     string[] predefined = { "some", "predefined", "words" }; 
     string[] products = { ".NET", "C#", "C# (2)" }; 

     IEnumerable<string> escapedKeywords = 
      predefined.Concat(products) 
         .Select(Regex.Escape); 
     Regex regex = new Regex("(" + string.Join("|", escapedKeywords) + ")"); 
     Console.WriteLine(regex); 
    } 
} 

Ausgang:

(some|predefined|words|\.NET|C\#|C\#\ \(2\)) 

oder ohne LINQ, aber unter Verwendung von String-Verkettung in einer Schleife nach Ihrem ursprünglichen Code (was ich versuchen zu vermeiden):

string regex = "(some|predefined|words"; 
foreach (Product product) 
    regex += "|" + Regex.Escape(product.Name); 
regex += ")";