使用正则表达式在C#中替换Unicode(泰米尔语)字符串

8
我正在实现泰米尔语的词法分析。我需要根据以下条件替换文本元素的值。
        string[] ugaramStrings = { "கு", "சு", "டு", "து", "பு", "று" };
        string[] tamilvowels =
            {
                "அ",// "\u0b85"
                "ஆ",//"\u0b86"
                "இ",//"\u0b87"
                "ஈ",//"\u0b88"
                "உ",//"\u0b89"
                "ஊ",//"\u0b8A"
                "எ",// "\u0b8E"
                "ஏ",//"\u0b8F"
                "ஐ",//"\u0b90"
                "ஒ",//"\u0b92"
                "ஓ",//"\u0b93"
                "ஔ"//"\u0b94"
            };

如果有任何单词同时包含ugaramStrings和泰米尔元音元素,则需要替换ugaram字符串并返回值。
例如,அமர்ந்*துஇ*னிது被替换为அமர்ந்**னிது。 即 துஇ=>இ
我通过使用TextElementEnumerator类检查下一个字符串元素来完成此操作。 是否有可能使用RegularExpression进行替换?
1个回答

6

试试这个:

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# char

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

这是非法的:

char ch = 'இ';

这是合法的:

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

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


非常好。我试图按照[]的方式去做,但像你想象的那样卡住了。我想知道是否有任何方法可以告诉正则表达式操作字形而不是单个字节字符 - 即将字形视为字符?我尝试了String.Normalize的各种变体和在Regex上设置文化,但没有什么运气。 - acarlon
@acarlon 不,.NET正则表达式仅适用于单个16位字符(因此对于非BMP字符,有时只涉及一半的Unicode字符),并且不能直接处理完整的字形,因此很遗憾无法做到这样的事情。 - xanatos
谢谢,我已经想到了。在我的评论中,“single byte” 应该被翻译为 “single char”。 - acarlon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接