插入符位置不一致,字符串长度和C#中的匹配索引

时间:2015-06-25 14:41:22

标签: c# textbox caret scintilla

我正在尝试使用Regex在Scintilla文本框中获取当前选定的单词,我注意到报告的字符串长度,匹配索引和插入符号位置或选择开始之间存在一些不一致:

private KeyValuePair<int, string> get_current_word()
{
    int cur_pos = scin_txt.Selection.Start;
    KeyValuePair<int, string> kvp_word = new KeyValuePair<int, string>(0, "");
    MatchCollection words = Regex.Matches(scin_txt.Text, @"\b(?<word>\w+)\b");
    foreach (Match word in words)
    {
        int start = word.Index;
        int end = start + word.Length;
        if (start <= cur_pos && cur_pos <= end)
        {
            kvp_word = new KeyValuePair<int,string>(start, word.Value);
            break;
        }
    }
    return kvp_word;
}

简而言之,我在单词中拆分字符串并使用匹配索引来查看插入符号当前是否包含在单词中。

不幸的是,这些数字似乎不匹配:

scin_txt包含字符串:

  

“Le clic droitaétédéactivépourcette image.J”

此字符串长度为49个字符,但TextLength属性返回 53 Selection.Start(或Caret.Position,相同结果)属性返回 52 。插入符号位于字符串的最后一个位置,并且(据我所知)字母“J”后面没有空格或不可见字符。

同时正则表达式匹配索引和长度似乎正确。

这是一个错误还是我不明白如何计算长度和选择索引?是否有解决方法可以找到包含插入符号的单词?

1 个答案:

答案 0 :(得分:2)

Scintilla API的名字很糟糕。 Text属性返回字节而不是文本,TextLength给出字节数,而不是字符数。

据推测,您使用的是UTF-8模式,因此“文本”是实际的:

  

Le clic droit a \ xc3 \ xa9t \ xc3 \ xa9 d \ xc3 \ xa9sactiv \ xc3 \ xa9 pour cette image。 Ĵ

正好是53个字节。

修改

如果要查找单词开头/结尾的位置,则会显示SCI_WORDSTARTPOSITION / SCI_WORDENDPOSITION条消息。对于插入符号定位,有SCI_POSITIONBEFORE / SCI_POSITIONAFTER个消息,它们考虑了当前的代码页。 (据推测,这些消息在您正在使用的特定Scintilla绑定的API中都具有功能等同物 - 或者可能是用于访问它们的一些通用SendMessage函数。)