4

在阅读 Emacs 中“替换匹配”功能的描述时,我不明白什么是“子表达式”属性以及应该如何使用它?例如, (replace-match (format-time-string writestamp-format (current-time)) t t nil 1) “1”是什么意思?!

4

2 回答 2

3

手册

如果 subexp 不为零,则表示仅替换匹配的正则表达式的子表达式编号 subexp,而不是整个匹配。例如,在匹配 'foo (ba*r)' 之后,调用 replace-match with 1 as subexp 意味着只替换匹配 '(ba*r)' 的文本。

您需要首先了解正则表达式的子表达式,以了解此功能:通过用大括号分隔正则表达式的一部分,您可以对其进行分组,然后访问这些组。如果您想在执行query-replace-regex. 这就是它在这里的工作方式。

想象一下,您想用 替换每次出现bar(SOMETHING)foo(SOMETHING)。所以你首先匹配bar(\([^)]*\))(这意味着除了括号之外的每个字符)都允许,并且我们的第一个子表达式是在\(and之间匹配的所有内容\)

于 2012-07-22T16:03:40.580 回答
1

我用谷歌搜索了“emacs subexpression”,第一次点击解释了它:

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

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

于 2012-07-22T16:03:29.520 回答