“重新捕获”转义字符

Posted

技术标签:

【中文标题】“重新捕获”转义字符【英文标题】:"Recapturing" escape characters 【发布时间】:2013-02-05 17:32:52 【问题描述】:

在 c# 中,假设我不知道最后一个字符、转义字符之后的字符或前面是否有任何字符,或者多个转义字符,我如何将字面意义上的 "\\b" 转换为字面意义上的 "\b"

【问题讨论】:

Unicode 转义序列有多个字符怎么办? 【参考方案1】:

我不能 100% 确定您的确切要求,但要将 "\\b" 降低到 "\b" 您可以尝试使用 Regex Unescape。

var foo = @"\\b"; //The @ is important if you wish to keep things literal 
var bar = System.Text.RegularExpressions.Regex.Unescape(foo);

【讨论】:

【参考方案2】:

如果不知道“\b”之前出现的字符,您就无法做到这一点。

在这种特殊情况下,该字符串将被解析为"\b",因为转义序列'\\' 被读取为'\'

但是,如果在 "\\b" 之前有另一个 "\",您会得到不同的结果。

例如,"\\\b" 将被解析为两个字符:"\""\b"

这并不能直接回答您的问题,但如果您不熟悉 C# 中的逐字字符串文字,您可能需要查找它们。您可以通过在字符串前面加上 @ 符号来将字符串文字标记为逐字字符串文字。这告诉编译器忽略转义序列(双引号除外)并完全按原样解析字符串。

【讨论】:

【参考方案3】:

简单的 String.Replace 就足够了:

var source = @"foo\\bbar";
var result = source.Replace(@"\\b", @"\b")

如果您不知道“b”部分 - 使用 Replace 的正则表达式版本,它允许您检查匹配本身:

var result = Regex.Replace(source, @"\\\\.", 
       match => match.Value .Substring(1))

【讨论】:

您的正则表达式很接近,尽管由于各种原因我不得不使用长手方法。encoded = Regex.Replace(encoded, @"\\.", delegate(Match m) return m.Value.Substring(1); ); 非常接近,因为它删除了双转义,但不会替换单个斜杠。对于@"\\\\.",要么找不到匹配项,要么找到并替换为双转义(即它不会改变)

以上是关于“重新捕获”转义字符的主要内容,如果未能解决你的问题,请参考以下文章

Java转义字符怎么输出的

C++特殊字符转义序列

转义字符

c中关于转义字符!!

SpringBoot Yaml 配置 特殊字符转义

java的转义字符