我希望你能帮忙,因为我不知道要使用哪个字符范围,或者是否有类似于ruby中我找到的[[:cntrl:]]这样的字符类?
所谓的非可打印字符是指删除所有在IE输出时未显示在输入字符串中的字符。请注意,我在寻找一个C#正则表达式,我的代码没有问题。
您可以使用以下方式删除所有控制字符和其他不可打印字符:
s = Regex.Replace(s, @"\p{C}+", string.Empty);
\p{C}
Unicode类别匹配所有控制字符,甚至包括ASCII表之外的字符,因为在.NET中,Unicode类别默认是Unicode感知的。
分解为子类别
\p{Cc}+
,参见Other, Control Unicode类别中的65个字符。它等价于[\u0000-\u0008\u000E-\u001F\u007F-\u0084\u0086-\u009F \u0009-\u000D \u0085]+
正则表达式。\u00AD
),零宽度空格 (\u200B
),零宽度非连接符 (\u200C
),零宽度连接符 (\u200D
),从左到右标记 (\u200E
),和从右到左标记 (\u200F
),请使用 \p{Cf}+
。其中包括天文位置代码点的等价物是一个(?:[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD80D[\uDC30-\uDC38]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F])+
正则表达式。\p{Co}+
或其等价物包括天文位置代码点,(?:[\uE000-\uF8FF]|[\uDB80-\uDBBE\uDBC0-\uDBFE][\uDC00-\uDFFF]|[\uDBBF\uDBFF][\uDC00-\uDFFD])+
。\p{Cs}+
或[\uD800-\uDFFF]+
正则表达式。@"[\p{C}-[\r\n\t]]+"
并将任何其他符号添加到嵌套括号中,以避免进行替换。 - Wiktor Stribiżewstring s = "Täkörgåsmrgås";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
关于不可打印字符的文档: https://en.wikipedia.org/wiki/Control_character
Char.IsControl 方法:
https://msdn.microsoft.com/en-us/library/system.char.iscontrol.aspx
也许您可以尝试:
string input; // this is your input string
string output = new string(input.Where(c => !char.IsControl(c)).ToArray());
删除所有控制字符和其他不可打印字符
Regex.Replace(s, @"\p{C}+", String.Empty);
只删除控制字符(如果您不想删除表情符号)
Regex.Replace(s, @"\p{Cc}+", String.Empty);
您可以尝试这个:
public static string TrimNonAscii(this string value)
{
string pattern = "[^ -~]*";
Regex reg_exp = new Regex(pattern);
return reg_exp.Replace(value, "");
}
\p{C}
(= 不可见控制字符和未使用的代码点),或者\p{Cc}
(仅控制字符,请参见http://www.regular-expressions.info/posixbrackets.html)。 - Wiktor Stribiżew