我正在尝试使用正则表达式在文件中搜索和替换,方法是使用“在文件中查找-替换”对话框开发5.x。我在哪里可以找到这方面的文档?
查找/替换的用户界面与我使用过的其他 IDE(例如 Eclipse)有很大不同:
- 它没有可以在其中输入正则表达式的搜索文本框,而是有一个模式文本框和一个模板文本框。模板文本框似乎有
printf
-style 格式选项。 - 它没有“替换为”文本框,而是有一个“替换模板”文本框,该文本框似乎也有
printf
- 样式格式选项。
KDevelop 的文档链接链接到KDevelop 维基,这与此无关,除非我错过了。
如果没有文档,相关源代码的链接以及相关部分的摘要就足够了。
答案1
%s 指的是模板和替换模板字段中的两个不同字段。模板字段中的 %s 指的是您在模式字段中键入的字符串。对于“替换模板”字段,它指的是您在“替换文本:”字段中输入的字符串,当您单击搜索按钮时,该字符串将出现在 IDE 底部出现的“在文件中查找/替换”停靠栏中。
您可以在这些领域中创造各种模式。例如,假设您想在文档中将 (vector) 替换为“foobar”。您可以在“模式”字段中键入不带引号的“向量”,在“模板”字段中键入不带引号的“(%s)”,以及在“替换模板”字段中键入不带引号的“[%s]”。点击搜索后,在扩展坞的替换文本字段中输入不带引号的“foobar”,然后点击替换按钮。
编辑:
这里有更多示例/解释。但请注意,我不是 Kdevelop 开发人员,也没有查看过源代码,我只是报告我通过反复试验学到的知识,不幸的是,我对“在文件中查找-替换”功能没有完全了解。
在“查找-替换”对话框(上图)中,我们有以下字段:
Pattern
:这个字符串就是你要找的。它可以支持正则表达式,但只有Regular expression
选中复选框时才有效。Template
:用于修饰搜索字符串的正则表达式。 “%s”是对您输入的字符串的引用Pattern
。您可以%s
多次使用。如果您的Pattern
设置为“foo”,则Template
“%s%s”模式将扩展为“foofoo”。然后,KDevelop 将搜索与左关联的“foofoo”匹配的文本。我不知道是否还有其他特殊的“%”引用可以使用,并且不需要使用“%s”。该字段的右侧是一个下拉菜单,其中包含您可以使用的各种预定义模板。不知道你能不能定义自己的。Replacement template
:用于装饰替换字符串的模式(未启用正则表达式)。值得怀疑的是,KDevelop 团队决定将该Replacement text
场放在另一个码头上(见下图)。您在该Replacement text
字段中输入的内容就是“%s”将扩展的内容。同样,您可以多次使用“%s”。我不知道是否还有其他特殊的“%”引用可以使用,并且不需要使用“%s”。Regular expression
:判断是否Pattern
可以使用正则表达式。Case sensitive
:切换区分大小写的搜索。Location(s)
:细化执行查找替换的位置。在右侧,您可以浏览到要运行的特定目录,或从预定义选项的下拉菜单中进行选择。我不确定你是否可以预定义你自己的。Depth
:不完全确定这是做什么的,我的猜测是它限制了您的“查找-替换”项目目录的深度。Limit to project files
:从菜单栏或右键单击菜单访问“在文件中查找/替换”时,此选项似乎永久不活动。这似乎使得过滤文件能够使用下面列出的模式进行搜索。Files
。我认为这可能是一个错误,您应该能够启用/禁用它。为了切换它,您需要通过“在文件中查找/替换”扩展坞中的放大镜访问“在文件中查找/替换”,请参见图片:Files
:要运行“查找替换”的文件类型的逗号分隔列表。Exclude
:运行查找替换时要忽略的逗号分隔目录列表(相对于项目根目录)和文件。
在上图中,我正在搜索“iomanip”的特定实例。使用该Template
模式,它将仅查找被 '<>' 包围且在 'iomanip' 中的 'i' 字符左侧具有可变位数的实例。在 中,Replacement template
我输入了一个愚蠢的括号模式,其中包含两个“%s”引用实例。每个“%s”都将扩展为我在 Dock 中的字段中输入的内容,单击“在文件中查找-替换”对话框中的按钮Replacement text
后,该 Dock 将出现在 IDE 底部。Search
见下图:
如您所见,“在文件中查找/替换”停靠栏将出现在 IDE 底部。在这里,我在字段中输入了“IamTheBest” Replacement text
。该字符串是Replacement template
上一个对话框中字段 中“%s”扩展后的字符串。
Template
树中是与上一个对话框中提供的扩展模式相匹配的命中列表。请注意,<29837489237482374iomanip>
和<iomanip>
被击中,但没有被击中"iomanip"
。从树中我们可以选择要包含在查找替换协议中的内容。现在我将把它们全部保留为选中状态。在下拉菜单中,您可以从以前的“查找-替换”过程中进行选择。单击Replace
按钮后,我们现在将看到:
这里还有更多示例/用例:
- 演示如何使用多个“%s”: 简而言之,它搜索“foo”的两个实例,左关联,并将它们替换为“Bar”的四个实例,并用各种愚蠢的单词分隔。请注意,第 12 行的单个“foo”和第 11 行的第三个“foo”未更改。
- 演示了他们的预定义模式之一
Template
“分配”: 它仅在赋值上下文中将“thisNumber”更改为“零”,但在相等上下文中则不然。
希望这有帮助!
编辑2:
鉴于您如何要求文档或至少源代码的链接,我决定将您链接到源代码。或者更确切地说,KDevelop 团队在 github 上发布的内容:
文件中的查找/替换功能封装在上面链接的 grepview 插件中。更具体地说,请查看 greputil.h 和 greputil.cpp。您将在此处找到用于在 和Template
字段中扩展“%s”的替换逻辑Replacement template
。
编辑3:
我对这个选项的陈述Limit to Project Files
不准确,我目前正在调查源代码以弄清楚它应该做什么......
编辑4:还没有弄清楚项目的限制,但我刚刚意识到有一个“这是什么?”此查找/替换菜单中的功能(窗口右上角的问号)。如果您单击?然后单击某些字段,它将显示更多有用的信息,特别是在搜索模式字段上。这是“这是什么?”它显示的文本:
如果您不选中下面的“正则表达式”,则这将被视为原始字符串。这意味着所有元字符都会被转义。
可能的元字符有:
。 - 匹配任何字符
^ - 匹配行首
$ - 匹配行尾
\b - 匹配单词边界
\s - 匹配任何空白字符
存在以下重复运算符:
? - 前一项最多匹配一次
* - 前一项匹配零次或多次
+ - 前一项匹配一次或多次
{n} - 前一项精确匹配 n 次
{n,} - 前一项匹配 n 次或多次
{,n} - 前一项最多匹配 n 次
{n,m} - 前面的项至少匹配 n 次,但最多匹配 m 次。
此外,可以通过符号 \n 来反向引用括号内的子表达式。
如需进一步参考,请访问 www.pcre.org 或 man pcresyntax。