2010-07-25 7 views
6

Necesito construir dinámicamente una expresión regular para atrapar las palabras clave propuestas, comoCómo codificar cadenas para Expresión regular en .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 += ")"; 

¿Existe algún tipo de Regex.Encode que hace esto?

Respuesta

8

Puede usar Regex.Escape. Por ejemplo:

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

Salida:

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

o sin el LINQ, pero el uso de la concatenación de cadenas en un bucle (que trato de evitar) como por su código original:

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