整体介绍
查找功能支持搜索文本以及使用正则表达式做搜索。基础的查找消息为SCI_SEARCHINTARGET,其他的消息可以在此基础上实现一些增强性查找。
Scintilla自身的基本正则表达式较为简单,如果需要复杂应用,则可以使用C++的<regex>库,此时需要用到SCFIND_CXX11REGEX这个查找标记。
本查找模块同时也支持替换功能。使用SCI_SEARCHINTARGET在目标范围内做搜索,其返回匹配文本范围的起始位置(如果失败则返回-1)。SCI_SEARCHINTARGET支持使用一些查找标记,比如SCFIND_MATCHCASE、SCFIND_WHOLEWORD、SCFIND_WORDSTART和SCFIND_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_SETTARGETSTART与SCI_SETTARGETEND为例做展示。
以UTF-8编码,如下文本内容为例:
此时对该文本发送如下消息:
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++的<regex>库进行匹配查找。 |
其中对于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编码,如下文本内容为例:
此时对该文本发送如下消息:
SCI_SETTARGETSTART(0); int totalLength= SCI_GETLENGTH(); SCI_SETTARGETEND(totalLength); SCI_SETWORDCHARS("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); int res = SCI_SEARCHINTARGET(2,"la");
则结果res值为:-1。
将前面编辑器中的Scintilla修改为Scintil la :(注意增加了空格)
此时对该文本发送如下消息:
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(<unused>, char *text) → position
获取消息SCI_SEARCHINTARGET查找成功的字符串,如果查找失败,则返回全部文档内容。
以UTF-8编码,如下文本内容为例:
此时对该文本发送如下消息:
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编码,如下文本内容为例:
此时对该文本发送如下消息:
SCI_SETTARGETSTART(0); int totalLength= SCI_GETLENGTH(); SCI_SETTARGETEND(totalLength); int res = SCI_SEARCHINTARGET(2,"la"); SCI_REPLACETARGET(-1, "tttttt\0");
则文本内容被改变为:
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_SEARCHANCHOR将SCI_SEARCHNEXT和SCI_SEARCHPREV使用的搜索起点设置为当前选择的起点,即距离文档起点较近的选择的终点。在调用SCI_SEARCHNEXT或SCI_SEARCHPREV之前,应始终调用此消息。
SCI_SEARCHNEXT和SCI_SEARCHPREV搜索文本指向的以零结尾的搜索字符串的下一次和上一次出现。搜索由searchFlags修改。
如果未找到任何内容,则返回值为-1,否则返回值为匹配文本的起始位置。所选内容将更新以显示匹配的文本,但不会滚动到视图中。
注:在SciTE中,向后向前查找依然采用SCI_SEARCHINTARGET的方法,通过修改查找范围来实现该功能。