2012-04-04 5 views
5

Mi chiedevo se esiste un modo per sostituire le sottostringhe all'interno di una stringa ma alternare la stringa con le quali sostituirle. I.E, corrisponde a tutte le occorrenze della stringa "**" e sostituisce la prima occorrenza con "<strong>" e la successiva occorrenza con "</strong>" (E quindi ripeti tale sequenza).Sostituzione alternata delle sottostringhe

L'ingresso sarebbe qualcosa di simile a questo: "This is a sentence with **multiple** strong tags which will be **strong** upon output"

E l'output restituito sarebbe: "This is a sentence with <strong>multiple</strong> strong tags which will be <strong>strong</strong> upon output"

+2

È possibile utilizzare 'IndexOf' con un indice iniziale in un ciclo. – CodesInChaos

+0

@CodeInChaos In realtà non ho usato IndexOf che spesso, prenderò in esame, ma avresti qualche metodo di implementazione? – JakeJ

risposta

6

È possibile utilizzare il sovraccarico di Regex.Replace che prende un MatchEvaluator delegato:

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 su questo. +1. – SkonJeet

+0

@Paolo L'ho appena usato e ho capito che il codice può essere abbreviato e sembra un po 'meglio se si sostituisce l'istruzione 'if' con' return index% 2 == 1? "": ""; ' – JakeJ

1

Il il modo più semplice per farlo sarebbe in realtà regex per **(content)** anziché solo **. Quindi lo sostituisci con <strong>(content)</strong> e il gioco è fatto.

Si potrebbe anche voler controllare MarkdownSharp a https://code.google.com/p/markdownsharp, poiché questo è davvero quello che sembra voler utilizzare.

+0

Questo è l'approccio più pulito, +1. –

+0

Ho guardato MarkDownSharp ma voglio solo il grassetto per l'input, non tanto per l'intera funzionalità. Potrei iniziare a usarlo quando viene richiesto più spesso – JakeJ

-1

Prova ora

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

applausi,

+0

che ovviamente non corrisponde alle sue specifiche. – CodesInChaos

+0

Questo rovinerà se gli spazi non esistono, e non c'è ragione per cui dovrebbero. –

+1

Funziona per l'input che ho specificato ma se il gruppo iniziale di '**' è all'inizio della stringa, si hanno problemi – JakeJ

-3

Credo che si dovrebbe usare espressioni regolari per abbinare il modello e sostituirlo, è abbastanza facile.

+0

troppo semplicistico per una risposta. Si prega di fornire un esempio nel codice che non è già stato fornito. – vapcguy

1

È possibile utilizzare un'espressione regolare per risolvere questo:

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

Questo approccio consente di gestire automaticamente gli errori di sintassi (si pensi a una stringa come This **word should be **strong**).