'子表达式如何'在"替换匹配"在emacs中的功能

时间:2012-07-22 15:49:39

标签: emacs elisp

在阅读Emacs中“替换匹配”功能的描述时,我无法理解'subexpression'属性是什么以及应该如何使用它?例如在 (replace-match (format-time-string writestamp-format (current-time)) t t nil 1) “1”是什么意思?!

2 个答案:

答案 0 :(得分:3)

来自the manual

  

如果subexp是非nil,则表示只替换子表达式数   匹配的正则表达式的subexp,而不是整个匹配。对于   例如,匹配'foo(ba * r)'后,将replace-match调用为1   因为subexp意味着只替换匹配'(ba * r)'的文本。

首先需要了解正则表达式的子表达式,以了解此功能:通过使用大括号分隔正则表达式的一部分,您可以对其进行分组,然后访问这些组。如果您想在执行query-replace-regex时重用替换文本中的部分匹配项,这非常有用。这就是它在这里工作的方式。

想象一下,您希望用bar(SOMETHING)替换foo(SOMETHING)的每个出现。因此,您首先与bar(\([^)]*\))匹配(这意味着括号内允许除)之外的所有字符,并且我们的第一个子表达式是\(\)之间匹配的所有内容。< / p>

答案 1 :(得分:1)

我用google搜索“emacs子表达式”,而first hit解释了它:

回想一下,正则表达式的子表达式是那些用转义括号分组的表达式,'\(... \)'。通过计算整个正则表达式开头的'\('的出现次数来找到countth子表达式。第一个子表达式编号为1,第二个子表达式编号为1,依此类推。

例如,如果对\([a-z]+\) \([0-9]+\)执行正则表达式搜索,则第一个子表达式包含[a-z]+部分,第二个子表达式包含[0-9]+部分。