2012-04-04 20 views
5

Me preguntaba si hay alguna manera de que pueda reemplazar las subcadenas dentro de una cadena, pero alternar entre las cadenas para reemplazarlas. I.E, haga coincidir todas las ocurrencias de la cadena "**" y reemplace la primera aparición con "<strong>" y la próxima aparición con "</strong>" (Y luego repita ese patrón).Reemplazo alternado de las subcadenas

La entrada sería algo como esto: "This is a sentence with **multiple** strong tags which will be **strong** upon output"

Y la salida devuelta sería: "This is a sentence with <strong>multiple</strong> strong tags which will be <strong>strong</strong> upon output"

+2

Puede usar 'IndexOf' con un índice de inicio en un bucle. – CodesInChaos

+0

@CodeInChaos Realmente no he usado IndexOf con frecuencia, lo examinaré pero ¿tendría algún método de implementación? – JakeJ

Respuesta

6

Puede utilizar la sobrecarga de Regex.Replace que toma un MatchEvaluator delegado:

using System.Text.RegularExpressions; 

class Program { 
    static void Main(string[] args) { 
     string toReplace = "This is a sentence with **multiple** strong tags which will be **strong** upon output"; 
     int index = 0; 
     string replaced = Regex.Replace(toReplace, @"\*\*", (m) => { 
      index++; 
      if (index % 2 == 1) { 
       return "<strong>"; 
      } else { 
       return "</strong>"; 
      } 
     }); 
    } 
} 
+0

Spot en esto. +1. – SkonJeet

+0

@Paolo Acabo de usar esto de nuevo y me di cuenta de que el código puede acortarse y parece un poco mejor si reemplaza la instrucción 'if' con' return index% 2 == 1? "": ""; ' – JakeJ

1

El La forma más fácil de hacerlo sería regexar realmente para **(content)** en lugar de solo **. A continuación, reemplace eso por <strong>(content)</strong> y listo.

Es posible que también desee comprobar MarkdownSharp en https://code.google.com/p/markdownsharp, ya que eso es realmente lo que parece que desea utilizar.

+0

Este es el enfoque más limpio, +1. –

+0

He mirado a MarkDownSharp, pero solo quiero la negrita para la entrada, no tanto las características completas. Puedo comenzar a usarlo cuando se solicite más a menudo – JakeJ

-1

¡Pruébalo

var sourceString = "This is a sentence with **multiple** strong tags which will be **strong** upon output"; 
var resultString = sourceString.Replace(" **","<strong>"); 
resultString = sourceString.Replace("** ","</strong>"); 

aplausos,

+0

que obviamente no se ajusta a sus especificaciones. – CodesInChaos

+0

Esto causará problemas si los espacios no existen, y no hay ninguna razón por la que deberían hacerlo. –

+1

Esto funciona para la entrada que especifiqué, pero si el grupo inicial de '**' 's está al comienzo de la cadena, tiene problemas – JakeJ

-3

Creo que debería utilizar expresiones regulares para que coincida con el patrón y reemplazarlo, es bastante fácil.

+0

Demasiado simple para una respuesta. Proporcione un ejemplo en el código que no se haya proporcionado previamente. – vapcguy

1

Se puede utilizar una expresión regular para resolver esto:

string sentence = "This is a sentence with **multiple** strong tags which will be **strong** upon output"; 

var expression = new Regex(@"(\*\*([a-z]+)\*\*)"); 

string result = expression.Replace(sentence, (m) => string.Concat("<strong>", m.Groups[2].Value, "</strong>")); 

Este enfoque se encargará automáticamente los errores de sintaxis (pensar en una cadena como This **word should be **strong**).

Cuestiones relacionadas