试图将这行 Java 理解为 C# 代码

Posted

技术标签:

【中文标题】试图将这行 Java 理解为 C# 代码【英文标题】:Trying to understand this line of Java, as C# code 【发布时间】:2011-05-17 02:57:43 【问题描述】:

查看这个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);

嗯...

【问题讨论】:

【参考方案1】:

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

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

你可以写:

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

或者,

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

【讨论】:

所以 Java 和 C# 都需要一个斜线来转义。但是在Java中,他们也需要$来转义? 但@Gabe 和@CodeCanvas 暗示这不是正则表达式替换? 它们都是完全正确的——如果这不是一个简化的版本,你就不需要这里的 rexeg。此外,C# 中没有 String.RegexReplace 方法,除非您使用扩展方法。 @Kobi - 是的,你是对的。我刚刚注意到它是 Regex.Replace(..) 的扩展方法。 @Kobi - 我已经用一些更新的信息更新了 OT。使用您的建议时,它仍然没有得到预期的输出。嗯……【参考方案2】:

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

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

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

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

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

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

【讨论】:

所以你是说 Java:"\\\\", "\\\\\\\\" 是单反斜杠被替换为双反斜杠?我以为那是两个黑斜线,到 4。?? Pure.Krome:Java replaceAll 函数执行正则表达式替换。 Java 编译器删除了一半的反斜杠,然后正则表达式编译器删除了剩余的一半。剩下的就是文字了。 @Pure.Krome - 不,这是一个反斜杠。你转义了两次:一次是字符串(所以编译器会看到 `\`),然后是正则表达式引擎 - 字符串中的两个反斜杠是一个反斜杠匹配。 "@ 表示 C# 中的文字字符串..." - @"" 是 verbatim 字符串文字,"" 是字符串文字。【参考方案3】:

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

【讨论】:

嗨伙计..我有点不明白你的答案。哪个代码?而我在做什么? 基本上它用 2 个反斜杠替换单个反斜杠,并将 '$' 替换为 '\$'。这样做的原因与我们编写 printf("\\"); 以获取输出 ` -- in this example, ` 是 printf 的特殊字符以及告诉 printf 您想要文字 ` (instead of the special meaning) is to quote it (and the quoting character is ` 的方式相同,因此是 ` \`).【参考方案4】:

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# 版本中删除一半的 \。

【讨论】:

\ 需要在 C# 字符串文字中进行转义,但在逐字字符串文字中不需要转义(即 string foo = @"\";)

以上是关于试图将这行 Java 理解为 C# 代码的主要内容,如果未能解决你的问题,请参考以下文章

试图理解这个汇编 x86 代码

如何将这行 VBA 转换为 LibreOffice Basic?

这行代码是啥意思?以及如何创建此类的对象?

试图理解 Java 中的高级游戏循环

requireonce 中的 PHP 绝对路径

Jquery:你能给我解释一下这行代码吗?帮助我理解它,或提供我可以了解它的参考