Scintilla教程(3): 查找

整体介绍

查找功能支持搜索文本以及使用正则表达式做搜索。基础的查找消息为SCI_SEARCHINTARGET,其他的消息可以在此基础上实现一些增强性查找。

Scintilla自身的基本正则表达式较为简单,如果需要复杂应用,则可以使用C++库,此时需要用到SCFIND_CXX11REGEX这个查找标记。

本查找模块同时也支持替换功能。使用SCI_SEARCHINTARGET在目标范围内做搜索,其返回匹配文本范围的起始位置(如果失败则返回-1)。SCI_SEARCHINTARGET支持使用一些查找标记,比如SCFIND_MATCHCASESCFIND_WHOLEWORDSCFIND_WORDSTARTSCFIND_REGEXP,可以使用SCI_SETSEARCHFLAGS做统一设置。

SCI_SETTARGETSTART,SCI_GETTARGETSTART,SCI_SETTARGETSTARTVIRTUALSPACE,SCI_GETTARGETSTARTVIRTUALSPACE,SCI_SETTARGETEND,SCI_GETTARGETEND,SCI_SETTARGETENDVIRTUALSPACE,SCI_GETTARGETENDVIRTUALSPACE,SCI_SETTARGETRANGE

SCI_SETTARGETSTART(position start) SCI_GETTARGETSTART → position SCI_SETTARGETSTARTVIRTUALSPACE(position space) SCI_GETTARGETSTARTVIRTUALSPACE → position SCI_SETTARGETEND(position end) SCI_GETTARGETEND → position SCI_SETTARGETENDVIRTUALSPACE(position space) SCI_GETTARGETENDVIRTUALSPACE → position SCI_SETTARGETRANGE(position start, position end)

上述所有消息都是与设定搜索范围相关(搜索时,如果设置“开始大于结束”,则会查找目标中的最后一个匹配文本,而非第一个匹配文本),以SCI_SETTARGETSTARTSCI_SETTARGETEND为例做展示。

以UTF-8编码,如下文本内容为例:

Scintilla教程(3): 查找_第1张图片 

此时对该文本发送如下消息:

SCI_SETTARGETSTART(0);
int totalLength= SCI_GETLENGTH();
SCI_SETTARGETEND(totalLength);
int res = SCI_SEARCHINTARGET(2,"la");

则结果res值为:7

SCI_TARGETFROMSELECTION

SCI_TARGETFROMSELECTION

只在所选范围(鼠标选中文本区域)内做查找。

SCI_TARGETWHOLEDOCUMENT

SCI_TARGETWHOLEDOCUMENT

在当前整个文档内做查找。

SCI_SETSEARCHFLAGS,SCI_GETSEARCHFLAGS

SCI_SETSEARCHFLAGS(int searchFlags) SCI_GETSEARCHFLAGS → int

设定查找标记,具体标记类型如下:

标记类型 说明
SCFIND_NONE 默认查找,不区分大小写
SCFIND_MATCHCASE 区分大小写
SCFIND_WHOLEWORD 整词查找,只有字符串被特殊字符分隔开,才算匹配成功(特殊字符是SCI_SETWORDCHARS定义之外的字符)
SCFIND_WORDSTART 整词首部匹配查找,整词的含义为:只有字符串被特殊字符分隔开,才算匹配成功,首部匹配指得是匹配整词的前几个或者全部字符串。
SCFIND_REGEXP 使用Scintilla所支持的基础正则表达式进行匹配查找
SCFIND_POSIX 以更兼容POSIX的方式处理正则表达式,方法是将带标记的部分的裸(and)解释为裸(and),而不是\(and\)。设置“SCFIND_CXX11REGEX”时无效
SCFIND_CXX11REGEX 使用C++库进行匹配查找。

其中对于SCFIND_REGEXP而言,其支持的正则表达式规则如下:

符号 作用描述
. 匹配所有字符
\( This marks the start of a region for tagging a match.
\) This marks the end of a tagged region.
\n Where n is 1 through 9 refers to the first through ninth tagged region when replacing. For example, if the search string was Fred\([1-9]\)XXX and the replace string was Sam\1YYY, when applied to Fred2XXX this would generate Sam2YYY. \0 refers to all of the matching text.
\< This matches the start of a word using Scintilla's definitions of words.
\> This matches the end of a word using Scintilla's definition of words.
\x This allows you to use a character x that would otherwise have a special meaning. For example, [ would be interpreted as [ and not as the start of a character set.
[...] This indicates a set of characters, for example, [abc] means any of the characters a, b or c. You can also use ranges, for example [a-z] for any lower case character.
[^...] The complement of the characters in the set. For example, A-Za-z means any character except an alphabetic character.
^ This matches the start of a line (unless used inside a set, see above).
$ This matches the end of a line.
* This matches 0 or more times. For example, Sa*m matches Sm, Sam, Saam, Saaam and so on.
+ This matches 1 or more times. For example, Sa+m matches Sam, Saam, Saaam and so on.

正则表达式将只匹配一行内的范围,而不会匹配多行。

使用SCFIND_CXX11REGEX时,可以使用更多功能,通常类似于JavaScript中的正则表达式支持。可以参见C++运行时的文档,以了解所支持的内容。

SCFIND_WHOLEWORD为例

UTF-8编码,如下文本内容为例:Scintilla教程(3): 查找_第2张图片

 

此时对该文本发送如下消息:

SCI_SETTARGETSTART(0);
int totalLength= SCI_GETLENGTH();
SCI_SETTARGETEND(totalLength);
SCI_SETWORDCHARS("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
int res = SCI_SEARCHINTARGET(2,"la");

则结果res值为:-1

将前面编辑器中的Scintilla修改为Scintil la :(注意增加了空格)

Scintilla教程(3): 查找_第3张图片

 此时对该文本发送如下消息:

SCI_SETTARGETSTART(0);
int totalLength= SCI_GETLENGTH();
SCI_SETTARGETEND(totalLength);
SCI_SETWORDCHARS("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
int res = SCI_SEARCHINTARGET(2,"la");

则结果res值为:8

SCI_SEARCHINTARGET

SCI_SEARCHINTARGET(position length, const char *text) → position

查找SCI_SETTARGETSTART和SCI_SETTARGETEND定义的目标中第一个出现的文本字符串。其入参中*text是待查找的字符串,length是待查找字符串的长度(不用加上最后的\0位)。查找由SCI_SETSEARCHFLAGS设置的查找标志修改。如果搜索成功,则将目标设置为找到的文本,返回值为匹配文本的起始位置。如果搜索失败,结果为-1。

上面已经用过该消息做样例。

SCI_GETTARGETTEXT

SCI_GETTARGETTEXT(, char *text) → position

获取消息SCI_SEARCHINTARGET查找成功的字符串,如果查找失败,则返回全部文档内容。

以UTF-8编码,如下文本内容为例:

Scintilla教程(3): 查找_第4张图片

此时对该文本发送如下消息:

SCI_SETTARGETSTART(0);
int totalLength= SCI_GETLENGTH();
SCI_SETTARGETEND(totalLength);
int res = SCI_SEARCHINTARGET(2,"la");
char text[10000] = { 0 };
SCI_GETTARGETTEXT(text);

则结果text值为:la

SCI_REPLACETARGET

SCI_REPLACETARGET(position length, const char *text) → position

用于替换查找到的字符串。形参中的length有两种设置方法,如果长度为-1,则文本为以零结尾的字符串,否则,长度设置为要替换目标的字符数。替换后,目标范围是指替换文本。返回值是替换字符串的长度。

请注意,建议删除文档中的文本的方法是将目标设置为要删除的文本,并使用空字符串执行替换目标。

以UTF-8编码,如下文本内容为例:

Scintilla教程(3): 查找_第5张图片 

 

此时对该文本发送如下消息:

SCI_SETTARGETSTART(0);
int totalLength= SCI_GETLENGTH();
SCI_SETTARGETEND(totalLength);
int res = SCI_SEARCHINTARGET(2,"la");
SCI_REPLACETARGET(-1, "tttttt\0");

则文本内容被改变为:

Scintilla教程(3): 查找_第6张图片

 

SCI_REPLACETARGETRE

SCI_REPLACETARGETRE(position length, const char *text) → position

用于使用正则表达式替换目标字符串。形参中的length有两种设置方法,如果长度为-1,则文本为以零结尾的字符串,否则长度为要使用的字符数。替换字符串由文本字符串组成,其中\1到\9的任何序列由最近正则表达式搜索中的标记匹配项替换,\0将替换为最近搜索中的所有匹配文本。替换后,目标范围是指替换文本。返回值是替换字符串的长度。

SCI_GETTAG

SCI_GETTAG(int tagNumber, char *tagValue NUL-terminated) → int

在正则表达式搜索中发现标记表达式匹配的文本。如果应用程序想要解释替换字符串本身,这将非常有用。

SCI_FINDTEXT

SCI_FINDTEXT(int searchFlags, Sci_TextToFind *ft) → position

此消息搜索文档中的文本。它不使用或移动当前选择。searchFlags参数控制搜索类型,其中包括正则表达式搜索。

通过在开始之前设置搜索范围的结束,可以向后搜索以查找搜索字符串的上一次出现。

Scintilla中定义了Sci_TextToFind结构体;使用文档中要搜索的位置范围设置chrg.cpMin和chrg.cpMax。通过将chrg.cpMax设置为小于chrg.cpMin,可以向后搜索。将Sci_TextToFind的lpstrText成员设置为指向包含搜索模式的以零结尾的文本字符串。

如果搜索失败,则返回值为-1;如果搜索成功,则返回找到的文本的起始位置。Sci_TextToFind的chrgText.cpMin和chrgText.cpMax成员用找到的文本的开始和结束位置填充。

Sci_TextToFind

Sci_TextToFind

此结构定义为具有与Win32结构FINDTEXTEX完全相同的形状,用于将Scintilla用作RichEdit控件的旧代码。

Sci_TextToFind具体定义如下:

struct Sci_TextToFind {
    struct Sci_CharacterRange chrg;     // range to search
    const char *lpstrText;                // the search pattern (zero terminated)
    struct Sci_CharacterRange chrgText; // returned as position of matching text
};

SCI_SEARCHANCHOR,SCI_SEARCHNEXT,SCI_SEARCHPREV

SCI_SEARCHANCHOR SCI_SEARCHNEXT(int searchFlags, const char *text) → position SCI_SEARCHPREV(int searchFlags, const char *text) → position

这三个消息提供了重定位的搜索支持。这允许宏记录多个增量交互式搜索,同时仍将选择设置为“已查找文本”,因此“查找/选择”操作是自包含的。如果启用了宏录制,这三条消息将发送SCN_MACRORECORD宏录制通知。

SCI_SEARCHANCHORSCI_SEARCHNEXTSCI_SEARCHPREV使用的搜索起点设置为当前选择的起点,即距离文档起点较近的选择的终点。在调用SCI_SEARCHNEXTSCI_SEARCHPREV之前,应始终调用此消息。

SCI_SEARCHNEXTSCI_SEARCHPREV搜索文本指向的以零结尾的搜索字符串的下一次和上一次出现。搜索由searchFlags修改。

如果未找到任何内容,则返回值为-1,否则返回值为匹配文本的起始位置。所选内容将更新以显示匹配的文本,但不会滚动到视图中。

注:在SciTE中,向后向前查找依然采用SCI_SEARCHINTARGET的方法,通过修改查找范围来实现该功能。

你可能感兴趣的:(Scintilla,c++)