【问题标题】:Replace Unicode (Tamil) string using Regular Expression C#使用正则表达式 C# 替换 Unicode(泰米尔语)字符串
【发布时间】:2013-09-15 07:42:21
【问题描述】:

我正在实现泰米尔语的词法解析。 我需要通过以下条件替换文本元素值

        string[] ugaramStrings = { "கு", "சு", "டு", "து", "பு", "று" };
        string[] tamilvowels =
            {
                "அ",// "\u0b85"
                "ஆ",//"\u0b86"
                "இ",//"\u0b87"
                "ஈ",//"\u0b88"
                "உ",//"\u0b89"
                "ஊ",//"\u0b8A"
                "எ",// "\u0b8E"
                "ஏ",//"\u0b8F"
                "ஐ",//"\u0b90"
                "ஒ",//"\u0b92"
                "ஓ",//"\u0b93"
                "ஔ"//"\u0b94"
            };

如果任何单词具有连续的 ugaramStrings 元素和泰米尔元音元素。 是否需要替换 ugaram 字符串并返回值。

例如அமர்ந்*துஇ*னிது替换为அமர்ந்**னிது。 即துஇ=>இ

我已经通过使用TextElementEnumerator 类检查下一个字符串元素来完成它。 是否有任何可能,以便使用RegularExpression替换它

【问题讨论】:

    标签: c# .net regex unicode tamil


    【解决方案1】:

    试试这个:

    string[] ugaramStrings = { "கு", "சு", "டு", "து", "பு", "று" };
    string[] tamilvowels =
    {
        "அ",// "\u0b85"
        "ஆ",//"\u0b86"
        "இ",//"\u0b87"
        "ஈ",//"\u0b88"
        "உ",//"\u0b89"
        "ஊ",//"\u0b8A"
        "எ",// "\u0b8E"
        "ஏ",//"\u0b8F"
        "ஐ",//"\u0b90"
        "ஒ",//"\u0b92"
        "ஓ",//"\u0b93"
        "ஔ"//"\u0b94"
    };
    
    var rxTemp = "(" +
        string.Join("|", ugaramStrings) + ")(" +
        string.Join("|", tamilvowels) + ")";
    
    var rx = new Regex(rxTemp);
    
    string str = "அமர்ந்*துஇ*னிது";
    
    // This will contain all the matches
    var matches = new List<Match>();
    
    string str2 = rx.Replace(str, match => {
        matches.Add(match);
        // Group[1] will contain the ugaram letter, 
        // Group[2] will contain the tamil vowel
        return match.Groups[2].Value;
    });
    

    它似乎工作正常。 str2 将包含替换的字符串,而 matches 将包含所有匹配项

    请注意,例如,ugaram 字符是组合字符,因此每个 ugaram“字符”使用两个 C#chars。

    例如 கு 是 'க' + 'ு'。

    这是非法的:

    char ch = 'இ';
    

    这是合法的:

    string str = "இ"; // str.Length == 2
    

    因此,您不能简单地[குசுடுதுபுறு],而必须(கு|சு|டு|து|பு|று)

    【讨论】:

    • 非常好。我试着用 [] 的方式来做,但你可以想象得到。我想知道是否有任何方法可以告诉正则表达式对字形而不是每个单字节字符进行操作 - 即将字形视为字符?我尝试了 String.Normalize 的变体并在正则表达式上设置文化,但运气不佳。
    • @acarlon 不,.NET 正则表达式在单个 16bit char 上工作(所以有时半个 unicode 字符,对于非 BMP 字符),并且不直接处理完整的字形,所以这是不可能的可悲的是,做这样的事情。
    • 谢谢,我想了很多。在我的评论中,“单字节”应该是“单字符”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2011-11-09
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2015-02-27
    相关资源
    最近更新 更多