试图理解这一系列的Java,作为C#代码

时间:2010-11-29 06:20:48

标签: c# java .net regex

请参阅此java代码: -

s = s.replaceAll( "\\\\", "\\\\\\\\" ).replaceAll( "\\$", "\\\\\\$" );

我有点理解它。这是一个正则表达式取代所有。

我尝试过以下C#代码......

text = text.RegexReplace("\\\\", "\\\\\\\\");
text = text.RegexReplace("\\$", "\\\\\\$");

但如果我有以下单元测试: -

} ul[id$=foo] label:hover {

java代码返回:} ul[id\$=foo] label:hover {

我的c#代码返回:} ul[id\\\$=foo] label:hover {

所以我不确定我理解为什么我的c#代码会放入更多\,主要是关于如何表示这些控制字符.. ??


更新

所以,当我使用XXX的想法只使用text.Replace(..)时,这是有效的。 例如

text = text.Replace("\\\\", "\\\\\\\\");
text = text.Replace("\\$", "\\\\\\$");

但我希望坚持使用RegEx ...尽量让它尽可能接近java代码。

正在使用的扩展方法是......

public static string RegexReplace(this string input, 
    string pattern, 
    string replacement)
{
    return Regex.Replace(input, pattern, replacement);
}

嗯...

4 个答案:

答案 0 :(得分:3)

Java需要在其替换字符串中转义所有$个符号 - "\\\\\\$"表示\\\$。如果没有它,它会抛出一个错误:http://www.regular-expressions.info/refreplace.html(寻找“$(未转义的美元作为文字文本)”。)

请记住$1$0等替换为带有捕获组的文本,因此replaceAll的第二个参数的语法部分有一部分。 C#的语法略有不同,并且不需要额外的斜杠,这需要字面上的。

你可以写:

text = text.RegexReplace(@"\\", @"\\");
text = text.RegexReplace(@"\$", @"\$");

或者,

text = text.RegexReplace(@"[$\\]", @"\$&");

答案 1 :(得分:1)

我认为这相当于这个C#代码:

text = text.Replace(@"\", @"\\"); 
text = text.Replace("$", @"\$");

@表示C#中的逐字字符串,这意味着字符串中的反斜杠不必使用更多反斜杠进行转义。换句话说,代码用双反斜杠替换单个反斜杠,然后用反斜杠替换一个美元符号,后跟一个美元符号。

如果你要使用正则表达式函数,它将是这样的:

text = text.RegexReplace(@"\\", @"\\"); 
text = text.RegexReplace(@"\$", @"\$$");

请注意,在正则表达式模式(第一个参数)中,反斜杠是特殊的,而在替换(第二个参数)中,它是特殊的美元符号。

答案 2 :(得分:-1)

代码引用原始字符串中的反斜杠和“$”字符。

答案 3 :(得分:-1)

Java正则表达式解析:http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html

C#:http://msdn.microsoft.com/en-us/library/xwewhkd1.aspx

认为在Java中,你必须使用\来转义\字符,但是在C#中,你没有。尝试在C#版本中取出一半\。