如何从字符串中删除非INTERNATIONAL字母数字字符

本文关键字:INTERNATIONAL 数字字符 删除 字符串 | 更新日期: 2023-09-27 18:00:34

在不删除非拉丁字母数字字符(如'Ж', 'ק', 'ओ', 'を')的情况下,如何从字符串中删除(或识别)非字母数字字符,如'-', '*', '‡', '€', '⁋', '™'

删除部分很容易,我的问题是区分非拉丁字母和非拉丁符号。


*所有现有的问答;A我发现过滤掉了非拉丁字母。

如何从字符串中删除非INTERNATIONAL字母数字字符

一个简单的解决方案(仅适用于基本BMP字符)是:

string str = "-*‡€⁋™Жקओを";
var sb = new StringBuilder();
foreach (char ch in str)
{
    bool isLetter = char.IsLetterOrDigit(ch);
    if (isLetter)
    {
        sb.Append(ch);
    }
}
string str2 = sb.ToString();

Char.IsLetterOrDigit被描述为:

指示指定的Unicode字符分类为字母还是十进制数字。

如果你想支持代理对,它会变得更复杂:

// 'U0001F000 is MAHJONG TILE EAST WIND
// 'U0001D49E is MATHEMATICAL SCRIPT CAPITAL C
string str = "-*‡€⁋™Жקओを'U0001F000'U0001D49E";
var sb = new StringBuilder();
for (int i = 0; i < str.Length; i++)
{
    bool isLetter = char.IsLetterOrDigit(str, i);
    bool isHighSurrogate = char.IsHighSurrogate(str[i]);
    if (isLetter)
    {
        sb.Append(str, i, isHighSurrogate ? 2 : 1);
    }
    if (isHighSurrogate && i + 1 < str.Length && char.IsLowSurrogate(str[i + 1]))
    {
        i++;
    }
}
string str2 = sb.ToString();