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