这篇文章是 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
+q
Ctrl
+j
】 - 要输入一个制表符,按下【
Ctrl
+q
Tab ⇥
】
(详细解释请参考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)。我更喜欢这个方式。