Emacs“查询 - 替换 - 正则表达式”不是regexing?

时间:2013-07-02 19:09:02

标签: regex emacs emacs24

我有大量文件需要完全删除某个函数调用。我做的第一件事就是使用find-direddired的输出生成find个文件列表:

find . \( -type f -exec egrep -q -i -e "awesomeMethod\(\s*true\s*\)" \{\} \; \) -ls

现在我有很多文件。所以我点击t来切换所有这些,然后突出显示。然后我点击Q,这会为所有标记的文件显示query-replace-regex。我不知道在我正在消除此调用的每个文件中调用的变量是什么,例如,它可能正在删除$a->awesomeMethod(true);$betterVariableName->awesomeMethod(true);,所以我需要一个真正的正则表达式。我正在考虑\S+\->awesomeMethod\(\s*?true\s*?\)或其他东西,并将其替换为零。我知道这绝对不是完美的 - 这是一个无语境的语法:-P - 但它会让我接近。

当这个正则表达式与任何东西都不匹配时,我感到很惊讶,因为它几乎与生成我的文件列表的正则表达式相同。然后我看到即使awesomeMethod\(true\)与任何东西都没有匹配,当我正在寻找它应该匹配的东西时。想到也许我不得不因为lisp而双重转义括号(即使我是以交互方式进行此操作),我尝试了awesomeMethod\\(true\\),这再次无法匹配。然后,令人惊讶的是,awesomeMethod(true) 确实匹配,因为(...)表示捕获组,因此显然不应该在正则表达式中。单个文件上的M-S-%给出相同的结果。

我做错了什么? Emacs 24.3。

1 个答案:

答案 0 :(得分:2)

emacs正则表达式中的括号是字面上的,除非它们使用反斜杠进行转义(然后它们表示捕获组)。

以下是更多信息的链接: http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexp-Backslash.html