`
border
  • 浏览: 206023 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

『Emacs 』Emacs中的正则表达式语法

阅读更多

From: http://bennyni.yculblog.com/post.1574745.html

网友翻译自info,特别注意的是lisp中的 \ 要写成 \ \,为这事我纳闷了老半天,就说怎么看不懂别人的那是啥意思了

* 正则表达式语法

      正则表达式(regular expressions, 缩写为regexp)是由几个特殊字符和一些普通
  字符组成,一个普通字符就是一个简单的正则表达式,仅仅可以匹配与自己相同的字
  符。而特殊字符包括"$","^",".","*","+","?","[","]"以
  及"\"。除非在一个字符前面有"\",否则正则表达式中出现的任何其他字符都是
  普通字符,(当你在 Lisp 程序中使用正则表达式时,每一个"\"都必须写成两个,,
  因为需要对字符串中的"\"转义,请看下面的例子。)

      例如,"f"不是特殊字符,是普通字符,因此"f"是一个正则表达式,它仅仅
  匹配串"f"。(不匹配"ff"。)同样"o"是仅匹配串"o"的正则表达式。(当不
  区分大小写时,前面的两个式子也匹配"F"和"O",而实际上,一般认为它们是
  "同样的串",并不是因为例外。)

      两个任意的表达式 A 和 B 可以连接,其结果是能够匹配以 A 开始,其余部分是
  B 的字符串的表达式。

      举个简单的例子,我们将表达式"f"和"o"连接,得到表达式"fo",仅匹配
  串"fo",很简单的。想做些不简单的,需要使用特殊字符。下面介绍这些特殊字符。

** 特殊字符

*** ". (Period)"

      匹配除了换行符(newline)之外任何单个字符的特殊字符。通过"连接",可以得
      到如"a.b"的表达式,匹配所有的以"a"开始,以"b"结束的三个字符的字符
      串。

*** "*"

      自身不构成表达式的部分,作为后缀操作符,表示某个前导表达式可以任意
      次重复。比如,"o*"匹配任意个"o"连成的串(包括空串)。

      "*"总是作用于"最少的"可能的前导表达式。于是,"fo*"中,可以重复的
      是"o",而不是"fo",匹配形如"f", "fo", "foo"的串等等。

      匹配程序以迅速且尽可能多的找到重复部分来处理带"*"的结构。然后继续其他
      部分的处理。如果失败了,为了使剩余的部分能够尽可能的匹配,匹配程序会回
      退,释放一些已经由"*"匹配的结构。例如,在使用"ca*ar"来匹配串
      "caaar"时,"a*"首先试图匹配全部的三个"a";但余下的部分是"ar",
      不能匹配"r",失败;接着选择用"a*"匹配两个"a",成功。

*** "+"

      和"*"相似的后缀操作符,它表示前导表达式要至少出现一次。例如,"ca+r"匹
      配串"car"和"caaaar",但不能匹配"cr"。

*** "?"

      也是一个和"*"相似的操作符,它表示前导表达式至多出现一次。例如,
      "ca?r"仅仅匹配"car"或"cr"。

*** "*?, +?, ??"

      是前面几个操作符的非贪心(non-greedy)的变体。正常的"*", "+", "?"
      操作符是"贪心的(greedy)",只要总体上能够匹配,这些操作符总是尽可能多
      的匹配。当紧跟着"?"时,则是非贪心的:将尽可能少的匹配。

      "ab*"和"ab*?"都能匹配串"a"和"abbbb";但如果你试图用它们来匹配
      "abbbb"时,"ab*"将匹配全部(最长有效匹配),而"ab*?"将仅仅匹配
      "a"(最短有效匹配)。

*** "\{N\}"

      指定重复次数为 N 的后缀操作符,前导表达式必须恰好出现 N 次。例如
      "x\{4\}"仅匹配串"xxxx"。

*** "\{N,M\}"

      指定重复次数在N和M之间的后缀操作符,就是说它的前导表达式的出现次数至少
      是N 但不能超过 M。如果省略 M,表示没有上限,但它的前导表达式至少出现 N
      次。"\{0,1\}"等于"?"。"\{0,\}"等于"*"。"\{1,\}"等于"+"。

*** "[ ... ]"

      字符集,以"["开始以"]"结束。最简单的例子,在两个方括号中间的字符就
      是这个集合所能匹配的全部。

      所以,"[ad]"仅匹配一个"a"或一个"d","[ad]*"匹配所有仅由"a"和
      "d"构成的串(和空串)。"c[ad]*r"匹配"cr","car", "cdr",
      "caddaar",等等。

      也可以用一个"-"放在一个开始字符和一个结束字符的中间,表示字符集中字符
      的范围。"[a-z]"匹配所有小写 ASCII 字母。范围可以和单独的字符自由的组
      合在一起,比如"[a-z$%.]",匹配了任意的小写字母,或"$","%",以及
      "."。

      注意,通常在字符集中的特殊字符不再特殊,而在字符集中的"]","-"和
      "^"却是特殊字符。

      如果想在字符集中包括字符"]",必须放在第一个字符位置。例如,"[]a]"匹
      配"]"或"a"。想包括"-",要在第一个或最后一个位置,或在一个范围的后
      面,如"[]-]"匹配"]"和"-"。

      如果想在字符集中包括字符"^",不可以放在第一个位置。(在开始位置,它会
      把这个字符集取补——看下面。)

      当不区分大小写使用范围时,表示范围的两个字符或者都是大写、或者都是小写、
      或者都不是字母。混合大小写的范围如"A-z"意思不明确,不被接受,或许在将
      来的 Emacs 中会被改变。

*** "[^ ... ]"
      "[^"表示"补集合",匹配的字符是除掉指定的字符外其他所有的字符。如,
      "[^a-z0-9A-Z]"匹配除掉ASCII字母和数字的所有字符。

      当"^"在字符集中第一个时,被看作是特殊字符。而跟在"^"后面的字符被看
      作是第一个字符(就是说,此处的"-"和"]"将不是特殊的)。

      一个补集合可以匹配换行符,除非换行符被指定为补集合中的一个字符。这不同
      于某些象"grep"的程序对正则表达式的处理。

*** "^"
      仅仅匹配在文本中行首的那个空串的特殊字符。就是说,"^foo"匹配在行首的
      "foo"。

*** "$"
      和"^"相似,但仅匹配行尾的空串。因此"x+$"匹配在行尾的一个或多个"x"
      的串。

*** "\"
      有两个作用:引用特殊字符(包括"\");产生附加的特殊结构。
     
      因为"\"引用特殊字符,"$"是一个仅匹配"$"的表达式,"\["是一个仅
      匹配"["的表达式,等等。

** 关于反斜线
      注意:为兼容性考虑,特殊字符,如果在其没有意义的上下文中,将被当作普通
  字符。比如:"*foo"中把"*"当作普通字符,因为在它前面没有可以作用的前导表
  达式。很少有人会根据这条规则去实践;无论如何,在任何地方都加上引用会更好些。

      对于大多数情况,"\"后接任何字符仅仅匹配那个字符。然而,有几个例外:
  以"\"开始的两字符序列会有特殊的意思。其中的第二个字符往往是普通字符。下
  面是"\"的结构表。

*** "\|"
      指定一个选择。中间有一个"\|"的两个正则表达式 A 和 B,形成了一个可以匹
      配 A 或 B 的文本。它首先试图用 A 匹配,如果失败再用 B 去试。

      由此,"foo\|bar"仅匹配"foo"或"bar"。

      "\|"作用于两边最长的可能的表达式。仅由"\( ... \)"括起来才可以限制
      "\|"的分组能力。

      Emacs 有全面的回退功能,以处理"\|"的多种的用途。

*** "\( ... \)"
      分组结构,有三个功能:

        1.围住"\|"的选择项,以实现别的操作。例如"\(foo\|bar\)x"匹配
          "foox"或"barx"。

        2.围住复杂的表达式以实现后缀操作符(如"*""+"和"?")的操作。例如
          "ba\(na\)*"匹配如"bananana"等,有任意个(零或更多)的"na"串。

        3.记录一个已匹配的子串用作后面的参考引用。

      最后一个应用并不是括号的分组功能思想的结果;这个分开的特点是给同样的
      "\( ... \)"结构赋予的第二种含义。在实际应用中,这两种含义通常不会发生
      冲突。当发生冲突的时候,可以使用"谨慎的"分组("shy" group)。

*** "\(?: ... \)"
      "谨慎的"分组("shy" group),这个分组不记录匹配的子串;你不能用"\D"来
      引用。这在机械的结合正则表达式的时候有用,这样,你可以为语法目的加入分
      组,而不用干涉使用者写的分组的个数。

*** "\D"
      匹配和"\( ... \)"结构第 D 次出现时所匹配的同样的文本。

      在"\( ... \)"结构结束之后,匹配程序保存被这个结构匹配的文本(的开始和
      结束);之后的正则表达式中,你可以使用"\"跟着一个数字 D 来表示"匹配
      和'\( ... \)'结构第 D 次出现时所匹配的同样的文本。"

      正则表达式中前九个出现的"\( ... \)"结构,按正则表达式中左括号出现的次
      序从 1 到 9 赋值。因此可以用""到""来引用相应的"\( ... \)"结构。

      例如,"\(.*\)"匹配任何有完全相同的两部分而无换行符的串。"\(.*\)"
      匹配前一半,可以是任意的串,""匹配后面的,但必须和前面的完全相同。

      如果一个特定的"\( ... \)"结构匹配了多次(比如后面有一个"*",这很显
      然),那么仅记录最后一次的匹配。

*** "\`"
      匹配空串,但仅是接在缓冲区的开始处的。

*** "\'"
      匹配空串,但仅是接在缓冲区的尾部的。

*** "\="
      匹配空串,但仅在"点(point)"处的。

*** "\b"
      匹配空串,但仅在一个词的开始或者结尾的。例如,"\bfoo\b"匹配任何作为单
      独的词出现的"foo"。"\bballs?\b"匹配作为单独的词出现的"ball"或
      "balls"。

      在缓冲区的开始和结束位置时,"\b"不考虑紧接其前的文本是什么。

*** "\B"
      匹配空串,但不在词的开始或结尾处。

*** "\<"
      匹配空串,但仅在词的开始处。仅当一个构成词的字符在缓冲区开始处时"\<"
      匹配缓冲区开始处的空串。

*** "\>"
      匹配空串,但仅在词的结尾处。仅当缓冲区尾部有构成词的字符时"\>"匹配缓
      冲区尾部的空串。

*** "\w"
      匹配任何构成词的字符。由语法表决定这些字符是什么。

*** "\W"
      匹配任何非构成词的字符。

*** "\sC"
      匹配任何语法是 C 的字符。这里 C 是一个指定特定语法类的字符:如"w"为词
      的构成字符,"-"或" "为空白,"."为普通标点符号,等等。

*** "\SC"
      匹配任何字符不属于语法 C。

*** "\cC"
      匹配任何属于种类 C 的字符。例如,"\cc"匹配汉字,"\cg"匹配希腊字符等。
      如果想了解已知种类,用"M-x describe-categories <RET>"。

*** "\CC"
      匹配所有不属于种类C的字符。

    属于词和语法的结构是由语法表的设置来控制的。

** 例
        下面是一个复杂的正则表达式,存储在"sentence-end",Emacs 将其用于识
    别句子的结束以及后面的任何空白。其中以 Lisp 语法区分了空白符和制表符。在
    Lisp 语法中,串常量用双引号括起来。"\""表示双引号是表达式的一部分,
    "\"表示反斜扛是表达式的一部分,"\t"表示制表符,"\n"表示换行。

         "[.?!][]\"')]*\($\| $\|\t\|  \)[ \t\n]*"

    其中包含四个连续的部分:匹配句号(".")、"?"或"!"的字符集;匹配右方括
    号、右(单/双)引号的字符集的任意次重复的部分;在"反斜线括号"部分中,匹配
    行尾、行尾空白、制表符或两个空格的可选集合;以及一个任意次匹配空白的字符
    集。

        在增量搜索中,要用 <TAB> 输入制表符,"C-j"输入换行符。也可以使用单
    独的反斜线,不用象 Lisp 串中那样写成两个。


Author: Wang Chunyu <dddkk@sina.com>
Create: "2002-04-20"

Local Variables:
mode: outline
fill-column: 76
End:

$Id: intro-regexp,v 1.4 2002/05/09 7:08:47 spr Exp $


--
Blog:    www.borderj.cn

  Border
分享到:
评论

相关推荐

    Python正则表达式操作指南.pdf

    ### Python正则表达式操作指南知识点总结 #### 一、Python正则表达式的引入与应用场景 - **Python正则表达式概述**: ...熟练掌握正则表达式的语法和技巧对于任何Python开发者来说都是非常重要的。

    正则表达式参考文档揭开正则表达式的神秘面纱

    正则表达式(Regular Expression,简称regex)是用于在文本中匹配特定模式的强大工具,广泛应用于数据...正则表达式参考文档12.mht文件中应包含更详细的语法说明、实例和使用技巧,建议下载查阅以获取完整知识体系。

    正则表达式书籍

    11. **实际应用**:书中可能涵盖如何在各种编程语言(如Python、Java、JavaScript)中使用正则表达式,以及在文本编辑器(如vim、emacs)或命令行工具(如grep、sed)中的应用。 12. **调试与测试**:介绍如何使用...

    了解正则表达式[归纳].pdf

    正则表达式(Regular Expression,简称regex或regexp)是一种强大的文本处理工具,它使用特定的语法来描述字符串模式,广泛应用于搜索、替换、数据提取等任务。在UNIX系统中,正则表达式有着广泛的应用,因为许多...

    很详细的Python正则表达式操作指南(re使用)

    Python的`re`模块提供了Perl风格的正则表达式模式,这使得开发者能够使用更为强大且灵活的正则表达式语法。相比于早期版本中提供的Emacs风格的正则表达式,Perl风格的正则表达式不仅功能更加强大,而且更加易于阅读...

    大有可为的“正则表达式”(一).docx

    正则表达式广泛应用于各种编程语言和工具中,如grep、sed、awk、Perl以及现代的IDE和文本编辑器(如vim、emacs)。 正则表达式的语法是其核心所在。以下是一些基本的元字符及其含义: 1. `^`:锚点,表示匹配字符...

    正则表达式

    正则表达式(Regular Expression),简称regex或regexp,是一种用于描述字符组合模式的强大工具,被广泛应用于各种编程语言和文本处理工具中,如`ed`、`vim`、`emacs`、`grep`、`awk`、`sed`和`Perl`等。正则表达式...

    深入浅出之正则表达式

    正则表达式的应用非常广泛,例如在编程语言中,它们被用于字符串处理函数,如JavaScript的`match()`、`search()`、`replace()`和`split()`等方法,Python的`re`模块等。在文本编辑器或命令行工具中,如Vim、Emacs和...

    Python正则表达式操作指南

    Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。Python 1.5之前版本则是通过 regex 模块提供 Emacs 风格的...得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只

    oniguruma-6.9.5_rev1.tar.gz

    它支持多种正则表达式语法,包括Perl、PCRE(Perl兼容正则表达式)和Emacs。Oniguruma以其高性能和良好的跨平台性受到开发者们的青睐。 二、版本6.9.5_rev1的特性 1. 改进的性能:Oniguruma 6.9.5_rev1在正则...

    python_re模块.pdf

    了解基本的正则表达式语法以及如何使用 `re` 模块中的函数(如 `re.search()`、`re.match()`、`re.findall()` 等)对于高效地进行文本处理至关重要。虽然正则表达式功能强大,但在某些复杂的情况下可能会变得难以...

    30分钟明白正则

    - 在日常工作中,正则表达式常用于文本编辑器(如vim、emacs)、命令行工具(如grep、sed)以及各种文本处理库。 正则表达式虽然起初可能显得复杂,但随着学习和实践,你会逐渐发现其强大的灵活性和实用性。它能够...

    RE: a regexp library for OCaml-开源

    这个库的独特之处在于它支持多种正则表达式语法,包括 Perl 风格、Emacs 风格以及 Posix 扩展正则表达式,这使得开发者可以根据自己的需求或习惯选择合适的语法来编写正则表达式。 Perl 风格的正则表达式通常被认为...

    Emacs 中文手册

    Emacs 支持正则表达式的搜索功能,可以帮助用户快速定位文件中的特定模式。 ##### 文件的替换 Emacs 支持替换文件中的文本,包括使用正则表达式进行复杂的替换操作。 ##### Regular Expression Emacs 的正则...

    pcre-8.44.tar.gz

    PCRE(Perl Compatible Regular Expressions)是由Philip Hazel开发的一个C语言编写的库,它的设计目标是尽可能地与Perl语言的正则表达式语法和行为保持一致。这使得程序员在使用PCRE时能够利用Perl的丰富和强大的...

Global site tag (gtag.js) - Google Analytics