2012-10-15 23 views
7

Ich arbeite gerade an einem Übersetzungsprojekt. Eines der Probleme, denen ich begegnete, ist, wenn ich versuche, Wörter Sonderzeichen zu ersetzen.Wie man [Wort] mit Wort ersetzt, das Regex.Replace verwendet und das ganze Wort nur ersetzen sollte

Zum Beispiel:

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

Ich brauche [Animal] mit Animal zu ersetzen. Bitte beachten Sie, dass ich nur das ganze Wort ersetzen muss. Also sollte das Ergebnis wie folgt sein:

Animal can be furry. 
Dog is an Animal. 

Auch, wie gesagt, es sollte das ganze Wort sein. Also, wenn ich habe:

[Animal][Animal][Animal] can be furry. - es ist nichts passiert als [Animal] nicht die gleiche wie [Animal][Animal][Animal]

Probe ist - das Ergebnis immer noch

[Animal][Animal][Animal] can be furry. sein soll:

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

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

Alles ist in Ordnung. Aber wie gesagt, ich muss das ganze Wort ersetzen. Und mit dem obigen Code wird "[Animal]can be furry" durch "Animalcan be furry" ersetzt, was ein Nein ist.

so auch habe ich versucht:

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

Immer noch nicht obwohl funktionieren. Und jetzt bin ich verloren. Bitte helfen Sie.

Ich möchte auch erwähnen, dass es eine fast ähnliche Post gibt, aber diese Frage erfordert nicht das Ersetzen des ganzen Wortes nur. Ich habe fast 3 Stunden über das Netz geschaut, ohne Erfolg. Ihre Hilfe wird sehr geschätzt. Vielen Dank!

Antwort

1

ich es nicht getestet, aber ich würde dies versuchen:

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

, dass nur [Tier] entsprechen würde an Wortgrenzen (\ b)

+2

Erlauben Sie mir, um das [.Net RegExp CheatSheet] (http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet) freundlich zu "inserieren", ist es sehr nützlich linkto zur Hand :) – quetzalcoatl

+1

Dies entspricht keinem der in der Frage angegebenen Beispiele, da '[' und ']' * keine Wortgrenze enthalten. Dies entspricht zum Beispiel "A [Tier] A", aber nicht "[Tier]". – verdesmarald

+0

Danke Jungs. Und ja, das hat funktioniert. Aber so viel wie ich kann, möchte ich nicht \ [verwenden, was passiert, wenn es andere Escape-Zeichen ist? Deshalb habe ich das Regex.Escape verwendet. – IPPO20jr

0

Dies funktioniert für mich. Probieren Sie es aus und lassen Sie mich wissen, wenn es das ist, wonach Sie suchen.

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" 

Gefunden here.

+0

Fast! Es schlägt fehl, wenn ich "Hund ist ein [Tier]. [Tier] kann pelzig sein. Es sollte auch übereinstimmen, wenn das [Tier] vorher/nachher ist.", ",", "!", Gleicher Effekt von \ b . – IPPO20jr

0

Ich denke, der einfachste Ansatz hier ist, einen Look-Behind und einen Look-Ahead zu verwenden, um sicherzustellen, dass der in Klammern gesetzte Text eine "echte" Übereinstimmung ist. Ich bin nicht sicher, Ihre genauen Anforderungen, aber es scheint, dass Sie suchen:

  1. die Suchkette, in eckigen Klammern (zB [Animal])
  2. Vorgängern Beginn der Zeichenfolge oder Leerzeichen, oder möglicherweise etwas punctation.
  3. durch das Ende der Zeichenfolge Gefolgt oder Leerzeichen oder möglicherweise einige Interpunktion (z.B.

Die erste ist einfach in Dog is an [Animal]. gefolgt von einem Punkt: \[Animal\].

Für die zweiten Sie einen Blick hinter verwenden können, das vorangehende Zeichen, um sicherzustellen, ist angemessen:
(?<=(^|\s)), und für den letzten Vorgriff: (?=($|\s|\.))

, die die ganze Regex bedeutet wird sein:

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

Möglicherweise müssen Sie dem Look-Ahead/Hintern entsprechend zusätzliche Interpunktion hinzufügen.

Für die Beispiele in Ihrer Frage:

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

Für mich dieses Werk:

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" */ 

Sie auch "Sonderzeichen", um die Maske hinzufügen:

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