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)