这篇文章是 emacs 正则表达式的教程。正则表达式可以帮助你找到特定模式的字符串。
正则表达式相关的命令
使用正则表达式的时候最常见的命令就是query-replace-regexp。参考Emacs: Find and Replace Commands。
其他一些常用的有:
dired-do-query-replace-regexp。参考Emacs: Find Replace Text in Directorylist-matching-lines。参考Emacs: Search / Highlight Words
当然还有很多其他的,想要把它们全部罗列出来可以执行apropos-command,然后输入“regex”。
Emacs 正则表达式语法
以下是经常使用的模式:
| Pattern | Matches | 
|---|---|
. | 
除换行(“\n”)以外的所有字符 | 
\. | 
一个点 | 
[0-9]+ | 
一个或多个数字 | 
[^0-9]+ | 
一个或多个非数字 | 
[A-Za-z]+ | 
一个或多个字母 | 
[-A-Za-z0-9]+ | 
一个或多个{字母,数字,连字符} | 
[_A-Za-z0-9]+ | 
一个或多个{字母,数字,下划线} | 
[-_A-Za-z0-9]+ | 
一个或多个{字母,数字,连字符,下划线} | 
[[:ascii:]]+ | 
一个或多个 ASCII 字符(码位从 0 到 127, 包括 0 和 127) | 
[[:nonascii:]]+ | 
一个或多个非 ASCII 字符 (比如, Unicode 字符) | 
[\n\t ]+ | 
一个或多个{换行符,制表符,空格} | 
| Pattern | Matches | 
|---|---|
"\([^"]+\)" | 
捕获双引号中的文本 | 
| Pattern | Matches | 
|---|---|
+ | 
匹配一次或多次前一个模式 | 
* | 
匹配零次或多次前一个模式 | 
? | 
匹配零次或一次前一个模式 | 
+? | 
匹配一次或多次前一个模式,但使用最小匹配(即,非贪婪模式) | 
| Pattern | Matches | 
|---|---|
^… | 
{行,字符串,buffer}的开头 | 
…$ | 
{行,字符串,buffer}的开头 | 
\`… | 
{字符串,buffer}的开头 | 
…\' | 
{字符串,buffer}的结尾 | 
\b | 
单词边界标记 | 
Unicode 字符可以使用字面量,比如说,→将会查找到右箭头字符。
你也可以用编码来表示任意字符,如\u2192。参考Emacs Lisp: Unicode Representation in String
完整的正则表达式语法列表参见(info “(elisp) Syntax of Regexps”)
换行符和制表符
当在命令交互的时候,emacs 不会识别\n和\t。
- 要输入一个换行符,按下【
Ctrl+qCtrl+j】 - 要输入一个制表符,按下【
Ctrl+qTab ⇥】 
(详细解释请参考Emacs’s Key Syntax Explained)
区分大小写
当使用[a-z]时,默认不区分大小写。是否区分大小写由变量case-fold-search控制。
执行toggle-case-fold-search来开启它。记得用完改回原值。因为 case-fold-search
也被包括 isearch 在内的几乎所有搜索或查找替换命令使用。
不要使用[A-z],因为它会匹配到一些标点。使用[A-Za-z]。
JavaScript 和 Emacs 正则表达式比较
大多数语言的正则表达式都相似,比如 JavaScript,Python,Ruby,Perl 等。Emacs 的
和它们不同。
以下是一些实际中常见的不同:
| JavaScript | emacs lisp | |
|---|---|---|
| Capture(捕获) | (…) | 
\(…\) | 
| digit(数字) | \d | 
[[:digit:]] | 
| word(字母) | \w | 
[[:word:]] | 
| whitespace(空白符) | \s | 
[[:space:]] | 
例如,JavaScript 中的\d+在 emacs 里是[[:digit:]]+。
注意:emacs 中字符类的含义根据当前主模式(major mode)的语法不同而不同。例如,什么
字符被认为符合[[:word:]]依赖于它当前主模式的语法表中怎么定义。但实际使用中通常
是你所期望的。
展示其中不同之处的一个例子可以参考Emacs Lisp: Regex Patterns and Syntax Table。
语法表很难处理,使用它的正则表达式可能匹配到的结果难以预料。最好是将你想匹配的字符
明确地写到正则表达式里,如[A-Za-z]。
交互式 Emacs 正则表达式
Emacs 有一个交互式的正则表达式模式。它在你输入的同时进行匹配。要进入这个模式,
调用regexp-builder。(我并不用它)
另外也可以调用query-replace-regexp来测试你的模式(pattern)。我更喜欢这个方式。