[译]Emacs: 正则表达式教程

原文地址:Emacs: Regex Tutorial

这篇文章是 emacs 正则表达式的教程。正则表达式可以帮助你找到特定模式的字符串。

正则表达式相关的命令

使用正则表达式的时候最常见的命令就是query-replace-regexp。参考Emacs: Find and Replace Commands

其他一些常用的有:

当然还有很多其他的,想要把它们全部罗列出来可以执行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)。我更喜欢这个方式。

Emacs Lisp 代码中的正则表达式

Emacs Lisp: Regex Tutorial

Reference

0%