C# 正则表达式用于删除混合有多种不同语言、unicode 字母的文本中的不可打印字符和控制字符

问题描述 投票:0回答:5

我将不胜感激你的帮助,因为我不知道要使用哪个范围的字符,或者我在 ruby 中找到了像 [[:cntrl:]] 这样的字符类?

通过不可打印,我的意思是在打印输入字符串时删除 ie 输出中未显示的所有字符。请注意,我寻找 C# 正则表达式,我的代码没有问题

c# regex unicode
5个回答
103
投票

您可以使用

删除所有控制字符和其他不可打印字符
s = Regex.Replace(s, @"\p{C}+", string.Empty);

\p{C}
Unicode 类别类匹配所有控制字符,甚至是 ASCII 表之外的控制字符,因为在 .NET 中,Unicode 类别类默认支持 Unicode。

将其细分为子类别

  • 要仅匹配基本控制字符,您可以使用
    \p{Cc}+
    ,请参阅其他、控制 Unicode 类别中的 65 个字符。它等于
    [\u0000-\u0008\u000E-\u001F\u007F-\u0084\u0086-\u009F \u0009-\u000D \u0085]+
    正则表达式。
  • 仅匹配 161 其他格式字符,包括众所周知的软连字符 (
    \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])+
    正则表达式。
  • 要匹配 137,468 其他私人使用控制代码点,您可以使用
    \p{Co}+
    ,或其等效项,包括星体位置代码点,
    (?:[\uE000-\uF8FF]|[\uDB80-\uDBBE\uDBC0-\uDBFE][\uDC00-\uDFFF]|[\uDBBF\uDBFF][\uDC00-\uDFFD])+
  • 要匹配 2,048 其他、代理代码点(包含一些表情符号),您可以使用
    \p{Cs}+
    [\uD800-\uDFFF]+
    正则表达式。

6
投票

你可以尝试:

string 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());

2
投票

删除所有控制字符和其他不可打印字符

Regex.Replace(s, @"\p{C}+", String.Empty);

仅删除控制字符(如果您不想删除表情符号😎)

Regex.Replace(s, @"\p{Cc}+", String.Empty);

2
投票

你可以试试这个:

    public static string TrimNonAscii(this string value)
    {
        string pattern = "[^ -~]*";
        Regex reg_exp = new Regex(pattern);
        return reg_exp.Replace(value, "");
    }

0
投票

您可以将它们替换为

\x<ASCII-Value>

,而不是删除不可打印的字符
var formattedText = Regex.Replace(text, @"\p{C}+",
            match => string.Join("",
                match.Value.ToCharArray().
                Select(ch => $"\\x{(int)ch:D2}")));

这会产生一个字符串

var text = "Bel\x07\n\rOr\t TAB"
Bel\x07\x0A\x0DOr\x09 TAB

© www.soinside.com 2019 - 2024. All rights reserved.