试图将这行 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# 代码的主要内容,如果未能解决你的问题,请参考以下文章