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)