RegEx删除除CR或LF之外的所有控制/不可见字符

时间:2015-02-05 19:51:16

标签: .net regex unicode

我正在尝试使用正则表达式(.Net)来“清理”Unicode输入字符串 - 要求是删除所有不可见字符/控制字符EXCEPT CR(回车)和LF(换行符)。换句话说,保留所有有效的可打印字符(英语和法语),包括CR和LF。

我已尝试过以下内容(仅使用下划线查看替换内容),但它也删除了CR / LF ...

clean_str = Regex.Replace( in_str, "\p{C}+", "_" )

也尝试过:

clean_str = Regex.Replace( in_str, "(\p{Cf}|\p{Co}|\p{Cs}|\p{Cn}|[\x00-\x09]|\x0b|\x0c|[\x0e-\x1f]|\x7f)+", "_" )

来自http://www.regular-expressions.info/unicode.html ...

p{C} or \p{Other}: invisible control characters and unused code points.

 ◦\p{Cc} or \p{Control}: an ASCII 0x00–0x1F or Latin-1 0x80–0x9F control character.
 ◦\p{Cf} or \p{Format}: invisible formatting indicator.
 ◦\p{Co} or \p{Private_Use}: any code point reserved for private use.
 ◦\p{Cs} or \p{Surrogate}: one half of a surrogate pair in UTF-16 encoding.
 ◦\p{Cn} or \p{Unassigned}: any code point to which no character has been assigned.

Guru's - 如果你有更好/更有效的方式 - 请发帖!

提前致谢!

2 个答案:

答案 0 :(得分:3)

您可以使用字符类减法从控制字符类中排除CR和LF:

clean_str = Regex.Replace( in_str, "[\p{C}-[\r\n]]+", "" )

答案 1 :(得分:2)

作为使用正则表达式的替代方法,您可以只迭代字符串。对于伪代码抱歉:

for (char c in in_str) {
    if (c < 32) {
        switch (c) {
        default: continue
        case '\n':
        case '\r':
        case 0x7F:
        }
    }
    clean_str.add(c);
}