📄 00000004.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER> <BR>Regular Expression <BR> <BR>所谓的 Regular Expression(以下简称 Regexp) <BR>是用来表达一连续字元的组合,或是用来描述字样(pattern) <BR>的一种方法,它在概念上不同於字串。 <BR> 字串是指由一连续字元(character)所形成的字元组, <BR>一个字元组就只代表一个特定的字串,而 Regexp 通常所代表 <BR>的是一组具有共通特性的字串集,此共通特性称为 pattern。 <BR> Regexp 的精神,就是希望以最少的字元,来表达最大的巨集。 <BR>所以 Regexp 所能表达的字串数应不只於一个,而是一个字串 <BR>的集合。这也是字串与 Regexp 最大不同处。当然, <BR>也可将字串视为 Regexp 的一个特例。 <BR> 本文一直没有讨论撰写程式的问题,但不可否认的, <BR>程式撰写使用到 Regexp的机会不胜数。举凡变数、常数的 <BR>重新命名,同类字串的搜寻,数个程式合并後的整理工作等等, <BR>若能灵活使用 Regexp ,则可达事半功倍之效。这是一篇 <BR>讨论 EMACS 使用入门的文章,并不是讨论程式语言的文章, <BR>所以只是将 Regexp 的用法告知。 <BR> <BR> 撰写程式常有的经验,就是要将数个函式合并後,必需将 <BR>使用这些函式的地方,以合并後的新名称取代。例如 read_i.c、 <BR>read_c.c 与read_f 等三个函式合并成 read.c 时,所有使用 <BR>这三个函式的地方,都必需改成 read.c。 <BR>此时,若以传统的修改方法,恐会漏一挂万,若采取代法, <BR>则必需执行三次的取代,才可以大功告成。但使用 Regexp , <BR>则可以一举成功。既方便又快速。 <BR> 又则,编辑文件或程式时,注解的功夫是不可或缺的。 <BR>不同的文件与语言,各有其不同的注解表示法。例如 <BR>LISP 语言是以 ``;'' 表示注解, LaTex 则以``'' 为注解。有时为了 <BR>将注解分类,极H不同数目的注解符号来做区分。此时遇到的问题 <BR>是,当重新分类注解时,相对应的注解符号也要调整。以 LISP语言为例, <BR>重新分类後,可能将拥有一个 ``;'' 及二个 ``;''的注解符号,以三个 ``;'' <BR>注解符号取而代之,这时若使用Regexp ,问题就可迎刃而解。 <BR> <BR> 程式档名的转换也可以 Regexp 来轻松完成。 <BR>因为不同的程式各有其不同的副名,例如 C 语言的副名为 ``.c'' , <BR>C++ 语言的副名为 ``.C'' ,而FORTRAN 语言则为 ``.f'' 等等。 <BR>此时,若想将 FORTRAN 语言所发展软体,转换成 C 语言, <BR>则必需将所有 ``.c'' 的档名做适当的调整。 <BR> <BR> 例如,将所有``filename.f'' 的档案,改为 ``filename.c'' 的档名。 <BR>此时,若使用 Regexp ,可能在极短的时间就可将所有的 <BR>档名转换成功。 Regexp 的运用非常的广泛,这□所举的例子 <BR>只是凤毛麟角。以下就开始简介 Regexp 的使用法,至於 <BR>更详细的介绍,请参照另一篇 94019 的技术报告。 <BR> <BR> Regexp 并非是 EMACS 的专利,而是 UNIX 系统下 <BR>的产物。 UNIX 系统下的许多工具程式都使用 Regexp , <BR>虽然彼此在表达 Regexp 的方法上,略有差别,但在概念上 <BR>却是一致的。 UNIX 系统上使用 Regexp 的工具,除了EMACS <BR>外,尚有ed 、ex 、vi 、sed 、awk 、grep 、egrep 等等。 <BR>这□所介绍的 Regexp,在概念上与其它地方是共通的, <BR>但在实际的运作上可能会有所出入。 <BR> <BR> Regexp 是由字元所组成,此字元分为一般字元与特殊字元 <BR>两种。一般字元所组成的 Regexp ,是最简单的 Regexp <BR>的表示法。因为它所要表达的字串与 Regexp 完全一模一样 。 <BR>由特殊字元所组成的 Regexp就较为复杂了。因为不同的特殊 <BR>字元,各有特殊的代表意义。 EMACS 中Regexp 的特殊字元有 <BR> $、 ^ 、 .、 * 、 + 、 ? 、 [、] 及 \等九个。例如, ``a'' 是一般 <BR>的字元,它也只代表 ``a'',别无其它。但是 ``a.''、 ``a*'' 、 ``a?'' <BR> 与 ``a+''等所代表的意义,除了 ``a'' 外,尚有其它的意涵。 <BR>特殊字元之外的字元,都是一般字元,但有些特殊字元是由 <BR>一般字元加上 \ 而形成的。 <BR> 现在来谈谈几个简单的 Regexp 的表示法。 <BR>想进一步多了解 Regexp,仍请参考编号为 94019 的技术报告。 <BR>以下就开始讨论,代表 Regexp 的符号 <BR>有九个。为了讨论上的方便,将其分成若干类: <BR> <BR> * 不在乎所出现的字母为何,可以『.』 来表示。 <BR> 所以『.』 代表除了 newline 之外的任何一个字元。 <BR> 例如 ``a.b'' 表示任何一个由三个字元所组成的字串, <BR> 此三个字元必需符合第一个字元是 ``a'', 第三个字元 <BR> 是 ``b'',但中间的字元只要不是 newline, <BR> 任何字元都可以。所以 ``a.b'' 可以为 <BR> aab、abb、acb、axb、a1b、a2b 等等, <BR> 甚至可以是一些特殊字元,只要这些特殊字元在此时没有 <BR> 特别的意义。例如 ``a^b''。 <BR> * 以特殊字元,来表示重复出现的一般字元。这些特殊字元称为 <BR> postfix character。其表示符号有 『*』、『+』 与『?』 等三种。 <BR> <BR> <BR> <BR> o 『*』 <BR> 任何字元之後加上『*』,可表示字元重复出现的次数, <BR> 从零次到无限多次。因此 ``ab*'',可表示, <BR> a、ab、abb、abbb、abbb以及 ab...b 到无限个 b。 <BR> <BR> o 『+』 <BR> 任何字元之後加上『+』,可表示字元重复的出现次数, <BR> 从一次到无限多次。因此 ``ab+'',可表示为 <BR> ab、abb、abbb、abbb 以及 ab...b 到无限个 b。 <BR> <BR> o 『?』 <BR> 任何字元之後加上『?』,可表示字元重复的出现次数, <BR> 不是零次就是只有一次。因此 ``ab?'' 不是表示为 ``a'' , <BR> 就是表示为 ``ab''。 <BR> <BR> <BR> * 若字元为属於某一特定集合中的元素时,可以字集(character set) <BR> 来表示。 <BR> 此时的代表符号是 [...]。中括号内就是放置字集的地方。如下讨论 <BR> 字集的若干变化。 <BR> <BR> <BR> <BR> o [...] <BR> <BR> 最简单的字集表示法,是将所有符合的字元放於在括号内。 <BR> 例如,[a@!d13]。此时,符合的字元就只有 a、@、!、1 和 3 <BR> 而已。 <BR> 若所表示的字集,具有一定□围的连续性,为了方便表达, <BR> 可以 [a-g] 来代表[abcdefg] 。 这一类的表示法,将会有更 <BR> 详细的讨论。 <BR> <BR> o [...] 与其它的特殊字元的配合。> <BR> <BR> <BR> <BR> + [...] 与 「*」 的配合 <BR> c[ab]d 代表 ``cad'' 或 ``cbd''。 <BR> c[ab]*d 代表头尾为 ``c'' 与 ``d'' 的字串 , <BR> 头尾间的组合,则由 <BR> [ab]* 来决定。 [ab]* 可表示为 <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -