获取第一个非标准英语字符的索引

时间:2015-06-05 14:55:45

标签: c# linq character-encoding globalization diacritics

当我找到一个不符合标准英文字母的字符时,我正在尝试处理字符串并将其分成两部分。例如This is a stríng with áccents.,我需要知道带有重音(í)的第一个或每个字符的索引。

我认为解决方案介于System.Text.EncodingSystem.Globalization之间,但我想念一些......

重要的是要知道它是否是带重音的角色,如果可能,请排除空格。

void Main()
{
    var str = "This is a stríng with áccents.";
    var strBeforeFirstAccent = str.Substring(0, getIndexOfFirstCharWithAccent(str));
    Console.WriteLine(strBeforeFirstAccent);

}

int getIndexOfFirstCharWithAccent(string str){
    //Process logic
    return 13;
}

谢谢!

2 个答案:

答案 0 :(得分:2)

正则表达式[^a-zA-Z ]将找到非重音罗马字母和空格以外的字符。

所以:

var regex = new Regex("[^a-zA-Z ]");
var match = regex.Match("This is a stríng with áccents.");

将返回í

match.Index将包含其位置。

答案 1 :(得分:1)

另一种可能的解决方案(根据Cortright的答案修改/改编)是枚举Unicode对。

const string input = "This is a stríng with áccents .";
byte[] array = Encoding.Unicode.GetBytes(input);

for (int i = 0; i < array.Length; i += 2)
{
    if (((array[i]) | (array[i + 1] << 8)) > 128)
    {
        Console.WriteLine((array[i] | (array[i + 1] << 8)) + " at index " + (i / 2) + " is not within the ASCII range");
    }
}

这将打印超出允许的ASCII值范围的所有数值的列表。 (我将ASCII的原始定义视为0-127。)

就个人而言,我推荐David Arno的解决方案。我只发布这个作为潜在的选择。 (可能更快,如果您对其进行基准测试。同样,可以也更易于管理。)

更新:我只是测试它,它似乎仍然可以正确识别更高范围内的字符(U + 10000 - U + 10FFFF),因为被允许。事实上,这是由于代理对也在ASCII范围之外。唯一的问题是它将它们识别为两个字符对,而不是一个。

输出:

237 at index 13 is not within the ASCII range
225 at index 22 is not within the ASCII range
55378 at index 30 is not within the ASCII range
57186 at index 31 is not within the ASCII range