emacs replace-regexp的语法

时间:2011-04-05 19:06:40

标签: regex emacs

我正在尝试找到每个日期并在其周围加上引号。我认为这应该是:

M-x replace-regexp 201\d-\d\d-\d\d <ret> '\&'

我还尝试了[0-9]而不是\d

它不起作用。但是使用isearch-forward-regexp我可以输入[0-9][0-9]并观看目标突出显示。我在替换时做错了什么?

4 个答案:

答案 0 :(得分:9)

Emacs regexp没有\d的通用[0-9]简写。

我只是将文本2011-04-01放入新缓冲区,返回缓冲区的开头,然后输入 Mx replace-regexp RET 201[0-9]-[0-9][0-9]-[0-9][0-9] RET '\&' RET ,日期被单引号包围,正如预期的那样。

答案 1 :(得分:5)

Emacs正则表达式语法不支持

\dC-h S regexp有关于它们的文档)。您可以像使用[0-9]一样使用,或使用POSIX样式[[:digit:]]

然而,你所做的(使用[0-9])应该有效,并且实际上只是为我工作。如果您在程序中使用正则表达式,则可能会发现M-x regexp-builder有用。

答案 2 :(得分:0)

您可能需要转义-s:

M-x replace-regexp <RET> 201[0-9]\-[0-9][0-9]\-[0-9][0-9] <RET> '\&'

答案 3 :(得分:0)

给出的正则表达式过于包容。以下内容也将与无效日期相匹配,例如&#34; 2014-01-33&#34;,但不是很多(假设YYYY-MM-DD排序):

&#34; ^ 20 [0-9] [0-9] - [0-1] [0-2] - [0-3] [0-9]&#34;

或者,以避免类似&#34; 2014-11-33&#34; (但不喜欢&#34; 2014-02-31&#34;或&#34; 2014-00-00&#34;),你可能会稍微限制一些:

&#34; ^ 20 [0-9] [0-9] - [0-1] [0-2] - \([0-2] [0-9] \ | 30 \ | 31 \ )&#34;