Discussion:
Regex.Replace
(zu alt für eine Antwort)
unknown
2006-04-24 06:39:25 UTC
Permalink
Hallo.

Ich habe folgenden String:

"stop\r\n"

In diesem versuche ich mittels folgender Methode die \ durch \\ zu ersetzen,
bekomme aber immer eine ArgumentException mit folgendem Text:

"\" wird analysiert - Unzulässiger \ am Ende des Musters.

kann mir jemand auf die Sprünge helfen, was ich falsch mache?


public string Replace(string cString, string cOld, string cNew, bool
lIgnoreCase) {
RegexOptions oOptions = RegexOptions.IgnoreCase;
cString = Regex.Escape(cString);
return Regex.Replace(cString, cOld, cNew, oOptions);
}

wobie
cString = "stop\r\n"
cOld = "\"
cNew = "\\"
lIgnoreCase = true

Vielen Dank für eure Hilfe.

Gruss, Thoma
Frank Dzaebel
2006-04-24 06:58:22 UTC
Permalink
Hallo Thomas,
Ich habe folgenden String: "stop\r\n"
In diesem versuche ich mittels folgender Methode die \ durch \\ zu ersetzen,
Mach es so:
string cString = "stop\r\n"; string cOld = @"\\"; string cNew = @"\\";
RegexOptions oOptions = RegexOptions.IgnoreCase;
cString = Regex.Escape(cString);
string res = Regex.Replace(cString,cOld,cNew,oOptions);

Der doppelte Backslash bei cOld ist notwendig,
da das eine "reservierte" Semantik im Pattern hat und
quasi escaped werden muss.


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
unknown
2006-04-24 07:26:20 UTC
Permalink
Hallo Frank,

Vielen Dank für den Hinweis. Ich habe nun die Methode Replace wie folgt
abgeändert:

public string Replace(string cString, string cOld, string cNew, bool
lIgnoreCase) {
cOld = Regex.Escape(cOld);
cNew = Regex.Escape(cNew);
RegexOptions oOptions = RegexOptions.IgnoreCase;
cString = Regex.Escape(cString);
cString = Regex.Replace(cString, cOld, cNew, oOptions);
cString = Regex.Unescape(cString);
return cString;
}

Nun bekomme ich keinen Fehler mehr. Aber wenn ich die Methode mit folgenden
Parametern aufrufe:

cString = stop\r\n
cOld = "\r\n"
cNew = "\\par "

wird \r\n nicht ersetzt. Ich sehe aber den Grund nicht, wiese das nicht
ersetzt werden sollte?

Kannst du mir nochmals weiterhelfen?

Gruss, Thomas
Post by Frank Dzaebel
Hallo Thomas,
Ich habe folgenden String: "stop\r\n"
In diesem versuche ich mittels folgender Methode die \ durch \\ zu
RegexOptions oOptions = RegexOptions.IgnoreCase;
cString = Regex.Escape(cString);
string res = Regex.Replace(cString,cOld,cNew,oOptions);
Der doppelte Backslash bei cOld ist notwendig,
da das eine "reservierte" Semantik im Pattern hat und
quasi escaped werden muss.
ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Frank Dzaebel
2006-04-24 07:42:31 UTC
Permalink
Hallo Thomas,
Vielen Dank für den Hinweis. Nun bekomme ich keinen Fehler mehr.
[...] cOld = "\r\n" ... wirds nicht ersetzt.
Nimm:
string cOld = "\\r\\n";
oder
string cOld = @"\r\n";


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
unknown
2006-04-24 08:00:01 UTC
Permalink
Hallo Frank,

aber wenn ich Regex.Escape(cOld) mache, ist das meiner Meinung nach das
gleiche, wie wenn ich den Parameter "escaped" übergeben würde, oder nicht? -
Im Debugger in der Variablenübersicht siehts jedenfalls so aus.

Gruss, Thomas
Post by Frank Dzaebel
Hallo Thomas,
Vielen Dank für den Hinweis. Nun bekomme ich keinen Fehler mehr.
[...] cOld = "\r\n" ... wirds nicht ersetzt.
string cOld = "\\r\\n";
oder
ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Frank Dzaebel
2006-04-24 09:01:58 UTC
Permalink
Hallo Thomas,
Post by unknown
aber wenn ich Regex.Escape(cOld) mache, ist das meiner Meinung nach das
gleiche, wie wenn ich den Parameter "escaped" übergeben würde, oder nicht? -
Im Debugger in der Variablenübersicht siehts jedenfalls so aus.
ja, nur in Deiner Methode machst Du das durch das
(zusätzliche) Escapen des cString wieder zunichte.
Nur der Pattern muss escaped werden.

RegexOptions oOptions = RegexOptions.IgnoreCase;
public string Replace(string cString,string cOld,string cNew,bool lIgnoreCase)
{ return Regex.Replace(cString,Regex.Escape(cOld),cNew,oOptions);
}


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Loading...