网络游戏《天下》 管理员手册

MudOS v21c2


     regexp(3)              MudOS (5 Sep 1994)               regexp(3)

     名称:
          regexp() - 正规描述式(regular expression)处理程式

     语法:
          string *regexp( string *lines, string pattern, void | int
          flag );

          字串 *regexp( 字串 *lines, 字串 pattern, 无参数 | 整数 flag );

     用法:
          一般而言,当以多行文字的阵列和正规描述式表达时,regexp(3) 会
          传回一个含有那几行符合指定的正规描述式文字之阵列。如果 flag
          (预设值 0)的位元 2 被设定,则将传回不符合者而非符合者。而
          如果 flag 的位元 1 被设定,则会传回这般格式 ({ 注标 1 + 1,
          符合 1, ..., 注标 n + 1, 符合 n }) 的阵列,这里的注标 1 是指
          第一个符合或是不符合者在文字行阵列中的注标(index)。

     正规描述式语法:
          一个正规描述式含有零个或是多个由 `|' 分隔的分段(branch)。它
          可配对任何符合这些分段之一。

          一个分段是由零个或多个部份(piece)相连成的。它可配对依序符合
          第一个单元、第二个单元等等。
          
          一个部份是一个可以接著 `*'、`+' 或 `?' 的单元(atom)。一个接
          著 `*'的单元可配对一串零个或是多个符合的单元。一个接著 `+' 
          的单元可以配对一串一个或多个符合的单元。一个接著 `?' 的单元
          则可以配对一个单元或是空字串。

          一个单元可以是一个在括弧中的正规描述式(配对这个正规描述式)
          、一个□围(range)(後面会说明)、`.'(配对任何单一字元)、
          `^'(配对输入字串开头的空字串)、一个接著单一字元的 `\'(配
          对这个字元)或是一个没有特殊意义的单一字元(配对这个字元)。

          一个□围是一串包含在 `[]' 内的字元。它一般是配对任何在序列中
          的任何单一字元。如果这个序列是以 `^' 开始,则它只能配对不是
          来自序列後半部的任何字元。如果在序列中的二个字元被 `-' 所分
          隔的话,则这是个含有介於它们间所有 ASCII 字元的简写(例如,
          `[0-9]' 可配对任何十进位数字)。要在序列中包含字元 `]'的话,
          就要将它放在第一个或是最後一个字元。

     不明确性(ambiguity):
          如果一个正规描述式可以符合输入字串的二个不同部份,则它将只
          会配对较早开始的那个。若二个都在相同位置开始但符合长度不同
          ,或是符合方法不同而同长度的话,情况就会变的很复杂,详述如
          下:

          一般上来说,一串分段的可能性是依由左至右的顺序,`*'、`+' 和
          `?' 总是尽量地配对最长的字串,巢状结构则会由外层开始,而连
          结(concatenated)的结构是由最左边的开始。将会选用的配对是使
          用了最早可能性的选择。如果有多於一个选择,则下一个也会因第
          一个选择而采取同样的方法(最早可能性),一直持续下去。

          举例来说,`(ab|a)b*c' 可以有二种方式配对 `abc' 。第一个选择
          是 `ab' 或 `a';因为 `ab' 较早符合而且可以配对成功,所以它
          被选用。由於 `b' 已被配对,所以 `b*' 必须配对它最後的可能-
          -空字串,因为它必须遵从较早的选择。

          一个没有 `|' 而只有一个 `*'、`+' 或 `?' 的特殊情况,它的净
          效应是最长可能配对将会被选用。因此,对 `xabbby' 来说,`ab*'
          将会配对 `abbbb'。注意到如果改对 `xabyabbbz' 来说,它将只
          会配对到 `x' 之後的 `ab'。(结果是,决定从哪里开始配对是第
          一个要做的选择,因为其後的选择也必须遵从它,甚至如果这只是
          个不太好的决定。)

     参考:
          sscanf(3), explode(3), strsrch(3), ed(3)

     翻译:
          [email protected]       97.Jul.26       (printed 3/16/95)