2008-10-15 17 views
5

tengo el siguiente C#, que se limite a sustituir partes de la cadena de entrada que se parecen a Equipar: 19d005 en direcciones URL, así:Expresión reemplazo mayúsculas regular en C#

input = Regex.Replace(input, @"(EQUIP:)(\S+)", @"<a title=""View equipment item $2"" href=""/EquipmentDisplay.asp?eqnum=$2"">$1$2</a>", RegexOptions.IgnoreCase); 

El HTML termina pareciéndose a esto.

<a title="View equipment item 19d005" href="/EquipmentDisplay.asp?eqnum=19d005">EQUIP:19d005</a> 

El único problema es que la página de destino espera que la cadena de consulta eqnum a estar en mayúsculas por lo que devuelve el equipo correcto cuando eqnum = 19D005 pero falla si recibe eqnum = 19d005.

Supongo que puedo modificar y corregir el requisito erróneo de valores en mayúsculas de EquipmentDisplay.asp; sin embargo, si es posible, me gustaría hacer que el código C# cumpla con la página ASP clásica existente al aplicar los $ 2 en la declaración Regex.Replace anterior .

Idealmente, me gustaría que el HTML devuelto a tener este aspecto:

<a title="View equipment item 19d005" href="/EquipmentDisplay.asp?eqnum=19D005">EQUIP:19d005</a> 

Aviso aunque la cadena original era Equipar: 19d005 (en minúsculas), sólo el eqnum = valor es uppercased.

¿Se puede hacer y, de ser así, cuál es la forma más ordenada de hacerlo?

Respuesta

12

OK, 2 soluciones, una línea:

input = Regex.Replace(input, @"(EQUIP:)(\S+)", m => string.Format(@"<a title=""View equipment item {1}"" href=""/EquipmentDisplay.asp?eqnum={2}"">{0}{1}</a>", m.Groups[1].Value, m.Groups[2].Value, m.Groups[2].Value.ToUpper()), RegexOptions.IgnoreCase); 

la otra usando una función separada:

var input = Regex.Replace(input, @"(EQUIP:)(\S+)", Evaluator, RegexOptions.IgnoreCase); 

private static string Evaluator(Match match) 
{ 
    return string.Format(@"<a title=""View equipment item {1}"" href=""/EquipmentDisplay.asp?eqnum={2}"">{0}{1}</a>", match.Groups[1].Value, match.Groups[2].Value, match.Groups[2].Value.ToUpper()); 
} 
+0

El one-liner es una solución muy elegante, que funcionó de maravilla por cierto. @Vinko menciona el uso de una función anónima pero no dio un ejemplo, por lo tanto, por qué elegí su solución. Estoy un poco confundido ya que he visto => usado para LINQ to SQL, árboles de expresiones y ahora funciones anónimas? ¿Por qué tantos usos? – Sprogz

+0

La sintaxis de estilo => es una versión más corta de la sintaxis delegate() {}. Las otras ventajas son que si tiene un trazador de líneas como el anterior, no necesita una declaración de devolución y los tipos se deducen, así que solo especifico m en lugar de Match m. La sintaxis lambda ayuda a que el código sea más sucinto. – Duncan

0

Suponiendo que la entrada es una cadena:

input = Regex.Replace(input.ToUpper, @"(EQUIP:)(\S+)", @"<a title=""View equipment item $2"" href=""/EquipmentDisplay.asp?eqnum=$2"">$1$2</a>", RegexOptions.IgnoreCase);

Cambiar el caso de una cadena no es algo que hace expresiones regulares.

3

Uso de Regex.Replace directamente No creo que haya una manera. Pero podría hacer que este sea un proceso de dos pasos y obtener el resultado que está buscando.

var match = Regex.Match(input, @"(EQUIP:)(\S+)", RegexOptions.IgnoreCase); 
var input = String.Format(@"&lt;a title=""View equipment item {1}"" href=""/EquipmentDisplay.asp?eqnum={2}""&gt;{0}{1}&lt;/a&gt;", 
match.Groups[1].Value, 
match.Groups[2].Value, 
match.Groups[2].Value.ToUpper()); 
1

Puede usar un delegado de MatchEvaluator en lugar de una cadena en el reemplazo. A continuación, puede insertar el delegado como una función anónima si está en .NET reciente. La solución de 'viejo' podría parecerse a algo como esto:

static void Main(string[] args) 
{ 
    string input = "EQUIP:12312dd23"; 
    string output = Regex.Replace(input, @"(EQUIP:)(\S+)", 
     new MatchEvaluator(genURL), RegexOptions.IgnoreCase); 
    Console.WriteLine(output); 
    Console.ReadKey(); 
} 
static string genURL(Match m) 
{ 
    return string.Format(@"<a title=""View item {0}"" 
      href=""/EqDisp.asp?eq={2}"">{1}{0}</a>", 
      m.Groups[2].Value,m.Groups[1].Value,m.Groups[2].Value.ToUpper()); 
} 
0
string input = "EQUIP:19d005"; 
Regex regex = new Regex (@"(EQUIP:)(\S+)", RegexOptions.IgnoreCase); 
string eqlabel = regex.Replace(input, "$1"); 
string eqnum = regex.Replace(input, "$2"); 
string eqnumu = eqnum.ToUpperInvariant(); 
input = string.Format(@"<a title=""View equipment item {1}"" href=""/EquipmentDisplay.asp?eqnum={2}"">{0}{1}</a>", eqlabel, eqnum, eqnumu); 
0
public static string FormatToCustomAnchorTag(this string value) 
{ 

    return Regex.Replace(value.ToLower() + value.ToUpper(), 
       @"(?<equiplo>equip:)(?<equipnolo>\S+)(?<equipup>EQUIP:)(?<equipnoup>\S+)", 
       @"<a title=""View equipment item ${equipnolo}"" href=""/EquipmentDisplay.asp?eqnum=${equipnoup}"">${equipup}${equipnolo}</a>"); 
} 
Cuestiones relacionadas