lex 命令中的扩展的正则表达式

lex 说明文件中指定扩展的正则表达式与在 sed 或者 ed 命令中所使用的方法相似。

扩展的正则表达式指定了要匹配的字符串的集合。 表达式包含文本字符和运算符字符。 文本字符与正在被比较的字符串中的相应字符匹配。 运算符字符指定重复次数、选项和其他功能。

数字和字母表的字母被认为是文本字符。 例如,扩展正则表达式integer与字符串匹配integer,以及表达式a57D查找字符串a57D.

运算符

下面的列表描述了如何使用运算符指定扩展的正则表达式:
字符
与字符 Character 相匹配。

例如: a与文字字符 a 匹配;b与字面值字符 b 匹配,并且c与文字字符 c 匹配。

"字符串"
匹配引号中扩起来的字符串,即使字符串包含运算符。

示例: 防止 lex 命令解释$(美元符号) 作为运算符,用引号将符号括起。

\字符 或 \数字
转义字符。 在字符串中使用的字符类运算符之前,\character 指示运算符符号表示文字字符而不是运算符。 有效转义序列包括:
\ a
警告
\ b
退格
\ f
换页符
\ n
换行符(不要在表达式中使用真正的换行符。)
\
回车
\
制表符
\V
垂直制表键
\\
反斜杠
\数字
其编码由 Digits 字符串指定的一位、两位或者三位八进制整数所表示的字符。
\x数字
其编码由 Digits 字符串指定的十六进制字符序列所表示的字符。

如果在请求中未找到\character 先于不在前面的转义序列列表中的字符, lex 命令从字面上解释该字符。

例如: \c被解释为c字符未更改,并且[\^abc]表示包含字符的字符类^abc.

注: 切勿使用\0 或\x0lex 命令中。
[列表]
与括起范围内的任何一个字符匹配 ([x - y]) 或包含的列表 ([xyz]) 基于调用 lex 命令的语言环境。 除以下运算符符号外,所有运算符符号都在括号表达式中失去其特殊含义:-(短划线) ,^(插入标记) ,以及\(反斜杠)。

例如: [abc-f]与 en_US 语言环境中的 abcdef 匹配。

[:CLASS:]
与属于指定的字符类的任何字符相匹配。[::]当前语言环境中 LC_TYPE 类别中定义的定界符。 下面的字符类名称被所有的语言环境所支持:
alnum   cntrl  lower   space

alpha   digit   print  upper

blank  graph   punct   xdigit

lex 命令还识别用户定义的字符类名。 该[::]运算符仅在以下情况下有效:[]expression.

例如: [[:alpha:]]与当前语言环境中 alpha 字符类中的任何字符匹配,但[:alpha:]仅与字符匹配:,a,l,ph.

[.CollatingSymbol.]
与在[..]将定界符作为单个字符。 该[..]运算符仅在以下情况下有效:[ ]expression. 对于当前语言环境,整理符号必须是有效整理符号。

例如: [[.ch.]]匹配ch同时[ch]匹配ch.

[=CollatingElement=]
与在[==]定界符和属于其等价类的所有整理元素。 该[==]运算符仅在以下情况下有效:[]expression.

示例: 如果wv属于同一等价类,[[=w=]][wv]和匹配项wv. 如果w不属于等价类,那么[[=w=]]匹配w仅如此。

[^字符]
匹配除以下字符以外的任何字符:^(插入标记) 符号。 结果字符类仅由单字节字符组成。 后面的字符^符号可以是多字节字符。 但是,要此运算符与多字节字符匹配,您必须在定义部分将 %h%m 设为大于零。

例如: [^c]与任何字符匹配,除了c.

CollatingElement-CollatingElement
在字符类中,指示为当前语言环境定义的整理顺序中的字符范围。 范围必须为升序。 结束范围点必须核对与起始范围点相等或者更高。 因为范围基于当前语言环境的整理顺序,所给的范围可能与不同的字符匹配,这取决于调用 lex 命令的语言环境。
expression?
与表达式的零个或一个实例匹配,该表达式紧跟在?操作程序。

例如: ab?c与 ac 或 abc 匹配。

句点字符 (.)
与换行符以外的任何字符匹配。 为了句点字符 (.) 为了与多字节字符匹配,必须在 lex 规范文件的定义部分中将 %z 设置为大于 0。 如果未设置 %z,那么句点字符 (.) 仅与单字节字符匹配。
expression*
匹配在前面的表达式的零个或多个实例*操作程序。 例如,a*是任意数量的连续a字符,包括零。 在复杂表达式中与零个具体值匹配的作用更明显。

示例: 表达式,[A-Za-z][A-Za-z0-9]* 指示具有前导字母字符的所有字母数字字符串,包括仅为一个字母字符的字符串。 您能使用该表达式识别使用计算机语言的标识。

expression+
匹配紧跟在+操作程序。

例如: a+与一个或多个实例匹配a另外,[a-z]+匹配所有小写字母字符串。

expression|expression
指示与 |(管道)运算符之前或之后的表达式匹配。

例如: ab|cd匹配abcd.

(expression)
与圆括号中的表达式匹配。 该()(括号) 运算符用于分组,并使括号内的表达式读入 yytext 数组。 圆括号中的组可用于代替任何其他模式的任何单个字符。

例如: (ab|cd+)?(ef)*将此类字符串匹配为abefef,efefef,cdef,或cddd; 但不abc,abcd,或abcdef.

^expression
仅当 Expression 位于行的开头并且^(插入标记) 运算符是表达式中的第一个字符。

例如: ^h匹配 h在一条线的开头。

expression$
仅当 Expression 位于行尾且$(美元符号) 运算符是表达式中的最后一个字符。

示例:h$ 与行尾的 h 匹配。

Expression1/Expression2
仅当 Expression2 紧跟在 Expression1 之后时指示匹配。 该/(斜杠) 运算符仅将第一个表达式读取到 yytext 数组中。

例如:ab/cd与字符串匹配ab,但前提是后跟cd,然后读取abyytext 数组中。

注: 只有一个/可以在单个扩展正则表达式中使用尾部上下文运算符。 该^(插入标记) 和$(美元符号) 运算符不能与/运算符指示尾部上下文的特殊情况。
{DefinedName}
与您在定义部分定义的名称匹配。

示例: 如果已定义D要为数字数字,{D}与所有数字数字匹配。

{Number1,Number2}
与它前面紧挨着的模式的 Nubmer1Number2 的具体值匹配。 表达式{编号}{编号,}也允许并且与表达式前面的模式的 Number 个实例完全匹配。

例如: xyz{2,4}与 xyzxyz , xyzxyzxyz 或 xyzxyzxyzxyz 匹配。 这与+,*?这些运算符仅与紧跟在它们前面的字符匹配。 要仅与时间间隔表达式前的字符匹配,请使用分组运算符。 例如,xy(z{2,4})与 xyzz , xyzzz 或 xyzzzz 匹配。

<StartCondition>
只有在词法分析器位于指示的启动条件中时,才执行关联的操作。

示例: 如果位于行的开头是开始条件ONE,那么^(插入标记) 运算符等于表达式<ONE>.

要使用运算符字符作为文本字符,请使用其中一个转义序列:" "(双引号) 或\(反斜杠)。 该" "运算符指示包含的内容是文本。 因此,以下示例与字符串匹配xyz++:
xyz"++"

可以给字符串的一部分加引号。 给普通的文本字符加引号不起作用。 例如,下面的表达式与前面的示例相等:

"xyz++"

要确保文本被解释为文本,请给不是字母或者数字的所有字符加引号。

将运算符字符转换为文本字符的另一种方法是将\(反斜杠) 字符在运算符字符之前。 例如,下面的表达式等价于上述示例:
xyz\+\+