Regex无法过滤指定Unicode字符,且误删需保留符号的解决方案求助
解决方案
根据你的需求,这里提供几种针对性的正则方案,覆盖不同场景:
场景1:字符串中是字面量的\uXXXX文本序列
你最初的正则未生效,是因为逐字字符串里\\表示两个反斜杠,而目标字符串中是单个反斜杠加uXXXX的文本。修改正则即可匹配并移除这些序列:
string buffer = "÷0130100422758673\\u0001Y\\u001ean//n\\u0004"; buffer = Regex.Replace(buffer, @"\u[0-9a-fA-F]{4}", String.Empty); // 输出:÷0130100422758673Yan//n
场景2:字符串中包含实际的Unicode控制字符
如果要移除的是真正的Unicode控制字符(比如U+0001、U+0004这类不可见字符),同时保留÷和常规可打印字符,用Unicode类别正则更精准:
string buffer = "÷0130100422758673\u0001Y\u001ean//n\u0004"; buffer = Regex.Replace(buffer, @"\p{C}", String.Empty); // 输出:÷0130100422758673Yan//n
兼容两种场景的组合方案
如果不确定字符串里是字面量序列还是实际控制字符,可组合两个正则处理:
string buffer = "÷0130100422758673\\u0001Y\u001ean//n\\u0004"; // 先移除字面量的\uXXXX序列 buffer = Regex.Replace(buffer, @"\u[0-9a-fA-F]{4}", String.Empty); // 再移除实际的控制字符 buffer = Regex.Replace(buffer, @"\p{C}", String.Empty); // 输出:÷0130100422758673Yan//n
针对你第二次尝试的修正
你之前用[^ -~]+误删÷,是因为÷的ASCII码(247)不在空格(32)到波浪线(126)的范围内,只需把÷加入允许的字符集合即可:
string buffer = "÷0130100422758673\\u0001Y\\u001ean//n\\u0004"; buffer = Regex.Replace(buffer, @"[^ -~÷]+", String.Empty); // 输出:÷0130100422758673Yan//n
补充说明
\p{C}是Unicode正则类别,匹配所有控制字符(不可见控制符、格式符等),比[^ -~]更精准,不会误删像÷这类不在ASCII可见范围但需要保留的字符。- 若有其他需保留的特殊字符,直接添加到字符集合中即可(比如
[^ -~÷€]+保留欧元符号)。
内容的提问来源于stack exchange,提问作者David Berken
相关产品推荐
相关产品推荐

