Pregunta

Dadas las siguientes cadenas de entrada y de expresiones regulares:

const string inputString = "${Principal}*${Rate}*${Years}";
const string tokenMatchRegexString = @"\${([^}]+)}";

¿Cómo puedo reemplazar cada ficha (es decir, $ {} Principal, $ {Rate} y $ {} años) con el valor de retorno de la función de mi 'ReplaceToken'?

private static string ReplaceToken(string tokenString)
{
    switch (tokenString)
    {
        case "Principal":
            return GetPrincipal();
        case "Rate":
            return GetRate();
        case "Years":
            return GetYears();
        default:
            throw new NotImplementedException(String.Format("A replacment for the token '{0}' has not been implemented.", tokenString));
    }
}

private static string GetPrincipal()
{
    throw new NotImplementedException();
}

private static string GetRate()
{
    throw new NotImplementedException();
}

private static string GetYears()
{
    throw new NotImplementedException();
}
¿Fue útil?

Solución

Regex tiene una sobrecarga que toma un MatchEvaluator. La entrada es un partido, y devuelve una cadena. El valor de Partido en este caso sería toda la razón, por lo que podría crear una cuña que extrae el valor (que ya está capturando dentro de su expresión regular) y se adapta al método informados.

Regex.Replace(inputString,
              tokenMatchRegexString,
              match => TokenReplacement(match.Groups[1].Value));

Otros consejos

Si realmente sólo hay un pequeño número de fichas para reemplazar a que se sabe de antemano, puede utilizar string.Replace() simplemente reemplazar las fichas, una por una. Esta técnica simple puede trabajar, pero tiene inconvenientes. No es particularmente extensible, que puede resultar en cadenas intermedias (desechables), y también puede resultar en código confuso.

Si usted espera tener muchas fichas diferentes y tienen reglas de coincidencia consistentes, se puede usar Regex.Replace() que tiene un delegado MatchEvaluator - esencialmente función que acepta un regular coincide con la expresión y devuelve una cadena para reemplazar el partido con. La ventaja de utilizar la sobrecarga de Replace() que toma un MatchEvaluator es que ayuda a evitar la creación de cadenas intermedias que están a continuación, sólo utilizados para reemplazar el próximo partido. También es bueno para reutilizar incorporado en las clases de .NET, en lugar de rodar su propia cuenta.

Por último, si usted tiene requisitos partido / de sustitución muy complejos, puede utilizar las bibliotecas como StringTemplate hacer más complejo ampliaciones de plantilla y sustitución partido.

Este es un ejemplo de la utilización de la llamada Regex.Replace():

const string inputString = "${Principal}*${Rate}*${Years}";
const string tokenMatchRegexString = @"\${([^}]+)}";

var rex = new Regex( tokenMatchRegexString );
MatchEvaluator matchEval = match => TokenReplacement( match.Groups[1].Value );

rex.Replace( inputString, matchEval );

No reinventar la rueda. Yo uso StringTemplate (la versión C #) al hacer cosas como esta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top