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