2012-10-15 13 views
7

Attualmente sto lavorando a un progetto di traduzione. Uno dei problemi che ho riscontrato è quando sto cercando di sostituire le parole caratteri speciali.Come sostituire [Word] con Word usando Regex.Replace e dovrebbe sostituire solo la parola intera

Ad esempio:

[Animal] can be furry. 
Dog is an [Animal]. 

Ho bisogno di sostituire [Animal] con Animal. Si prega di prendere atto che ho bisogno di sostituire solo la parola intera. Quindi il risultato dovrebbe essere il seguente:

Animal can be furry. 
Dog is an Animal. 

Inoltre, come ho detto, dovrebbe essere l'intera parola. Quindi, se ho:

[Animal][Animal][Animal] can be furry. - il risultato dovrebbe essere ancora

[Animal][Animal][Animal] can be furry. - non è successo niente, come [Animal] non è l'esempio stesso di [Animal][Animal][Animal]

:

string originalText1 = "[Animal] can be furry"; 
string badText ="[Animal]"; 
string goodText = "Animal"; 

Regex.Replace(originalText1, Regex.Escape(badText), Regex.Escape(goodText)); 

tutto è OK. Ma come ho già detto, ho bisogno che l'intera parola venga sostituita. E con il codice sopra, "[Animal]can be furry" sarà sostituito da "Animalcan be furry" che è un no no.

così ho anche provato:

Regex.Unescape(
Regex.Replace(
    Regex.Escape(originalText1), 
    String.Format(@"\b{0}\b", Regex.Escape(badText)), 
    Regex.Escape(goodText))) 

Ancora non funziona però. E ora sono perso. Per favore aiuto.

Vorrei anche menzionare che c'è un post QUASI simile, ma quella domanda non richiedeva la sostituzione di solo parole intere. Ho guardato oltre la rete per quasi 3 ore senza successo. Il tuo aiuto sarà molto apprezzato. Grazie!

risposta

1

non ho ancora testato, ma vorrei provare questo:

Regex.Replace(orginalText, @"\b\[Animal\]\b", "Animal"); 

Questo sarebbe solo abbinare [animali] a confini di parola (\ b)

+2

Permettetemi per "pubblicizzare" [.Net RegExp CheatSheet] (http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet) è molto utile linkto a portata di mano :) – quetzalcoatl

+1

Questo non corrisponde a nessuno degli esempi forniti nella domanda, perché '[' e ']' * non * contengono un limite di parole. Questo corrisponderà ad esempio "A [Animale] A' ma non" [Animale] '. – verdesmarald

+0

Grazie ragazzi. E sì, quello ha funzionato. Ma per quanto posso, non voglio usare \ [, cosa succede se sono altri personaggi di escape? è per questo che ho usato il Regex.Escape. – IPPO20jr

0

Questo funziona per me. Provalo e fammi sapere se è quello che stai cercando.

string originalText1 = "[Animal] can be furry"; 
string badText = @"(?:(?<=^|\s)(?=\S)|(?<=\S|^)(?=\s))" + Regex.Escape("[Animal]") + @"(?:(?<=\S)(?=\s|$)|(?<=\s)(?=\S|$))"; 
string goodText = "Animal"; 
string newString = Regex.Replace(originalText1, badText, goodText); 
Console.WriteLine(newString); 
//"Animal can be furry" 

originalText1 = "[Animal]can be furry"; 
newString = Regex.Replace(originalText1, badText, goodText); 
Console.WriteLine(newString); 
//"[Animal]can be furry" 

Trovato here.

+0

Quasi! Fallisce quando ho "Dog is an [Animal]. [Animal] può essere furry. Dovrebbe anche corrispondere se [Animal] è prima/dopo". ",", ","! ", Stesso effetto di \ b . – IPPO20jr

0

Penso che l'approccio più semplice qui sia quello di utilizzare un look-behind e un look-ahead per assicurarsi che il testo tra parentesi sia una corrispondenza "reale". Non sono sicuro di vostre esigenze, ma sembra che stai cercando:

  1. La stringa di ricerca, tra parentesi quadre (ad esempio [Animal])
  2. Preceduto dal inizio della stringa, o spazi bianchi, o forse un po 'di punteggiatura.
  3. seguita dalla fine della stringa, o spazi, o possibilmente qualche punteggiatura (ad esempio seguito da un periodo in Dog is an [Animal].

Il primo è facile: \[Animal\].

Per il secondo è possibile utilizzare un look-dietro al fine di garantire il carattere precedente è opportuno:
(?<=(^|\s)), e per l'ultimo un look-ahead: (?=($|\s|\.))

Il che significa che l'intera espressione regolare sarà:

var pattern = @"(?<=^|\s)\[Animal\](?=$|\s|\.)"; 
var output = Regex.Replace(input, pattern, "Animal"); 

Potrebbe essere necessario aggiungere ulteriore punteggiatura al look-ahead/behind appropriato.

Per gli esempi nella vostra domanda:

Input: "[Animal] can be furry." 
Output: "Animal can be furry." 

Input: "Dog is an [Animal]." 
Output: "Dog is an Animal." 

Input: "[Animal][Animal][Animal] can be furry." 
Output: "[Animal][Animal][Animal] can be furry." 

Input: "[Animal]can be furry" 
Output: "[Animal]can be furry" 
0

Per me questo funziona:

string s = @"[Animal][Animal][Animal] can be furry. - nothing happened as [Animal] is not the same as [Animal][Animal][Animal] 
[Animal] can be furry. 
[Animal] 
can [Animal] 
be furry 
my [Animal] is furry"; 
string mask = "(^|\\s)\\[Animal\\](\\s|$)"; 
string rep = "$1Animal$2"; 
string s2 = ""; 
s2 = Regex.Replace(mask, rep); 

/* 
s2 = "[Animal][Animal][Animal] can be furry. - nothing happened as Animal is not the same as [Animal][Animal][Animal] 
Animal can be furry. 
Animal 
can Animal 
be furry 
my Animal is furry" */ 

è anche possibile aggiungere "caratteri speciali" alla maschera:

string mask = "(^|\\s|'|\")\\[Animal\\](\\s|$|,|\\?|\\.|!|'|\")"; 
Problemi correlati