“重新捕获”转义字符
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); );
非常接近,因为它删除了双转义,但不会替换单个斜杠。对于@"\\\\."
,要么找不到匹配项,要么找到并替换为双转义(即它不会改变)以上是关于“重新捕获”转义字符的主要内容,如果未能解决你的问题,请参考以下文章