x
:匹配字符’x’.
:匹配除换行符以外的任何字符(字节)[xyz]
:字符类,匹配’x’、‘y’或’z’[abj-oZ]
:包含范围的字符类,匹配’a’、‘b’、从’j’到’o’的任何字母或’Z’[^A-Z]
:否定字符类,匹配字符类以外的任何字符[^A-Z\n]
:匹配除大写字母或换行符以外的任何字符[a-z]{-}[aeiou]
:匹配小写辅音字母,{-}
表示求差集r*
:零个或多个r
,r是任何正则表达式r+
:一个或多个r
r?
:零个或一个r
r{2, 5}
:两个到五个r
r{2,}
:两个及以上r
r{4}
:四个r
{name}
:name
定义到扩展(和flex有关)"[xyz]\"foo""
:文本字符串[xyz]"foo
\x
:如果x是’a’、‘b’、‘f’、‘n’、‘r’、‘t’或’v’,则表示转移字符,否则就是字符原字符的含义\0
:NUL字符,ASCII代码0\123
:八进制值为123的字符\x2a
:十六进制值为2a的字符(r)
:匹配正则表达式r,括号用于覆盖优先级(?r-s:pattern)
:在解释模式时应用r
和-s
这样的选项。它们的含义是:
模式 | 含义 |
---|---|
i | 不区分大小写 |
-i | 区分大小写 |
s | 覆盖. 的语义,. 现在可以匹配任何字符 |
-s | 保留. 原来的语义,匹配\n 以外的任何字符 |
x | 忽略模式中的注释和空格 |
下面给出一些运用(?r-s:pattern)
的例子:
模式 | 等同于 |
---|---|
(?:foo) | (foo) |
(?i:ab7) | ([aA][bB]7) |
(?-i:ab) | (ab) |
(?s:.) | [\x00-\xFF] |
(?-s:.) | [^\n] |
(?ix-s:a . b) | ([Aa][^\n][bB]) |
(?x;a b) | ("ab") |
(?x:a\ b) | ("a b") |
(?x:a" "b) | ("a b" |
(?x:a[ ]b) | ("a b") |
(?x:a /* comment */ b c) | (abc) |
(?# comment)
:用于向正则表达式中添加注释,flex在处理正则表达式时会移除’(‘和’)'以及它们之间的内容,注释可能跨行rs
:正则表达式r
后串联正则表达式s
r|s
:匹配正则表达式r
或正则表达式s
r/s
:匹配后面跟着s
的正则表达式r
^r
:在一行的开头匹配r
r$
:匹配紧跟一行末尾的r
<s>r
:匹配r时的启动条件是s
<s1,s2,s3>r
:匹配r
时的启动条件是s1
、s2
和s3
中的任意一个<*>r
:匹配r
时启动条件任意<<EOF>>
:文件结尾<s1,s2><<EOF>>
:启动条件为s1
或s2
时匹配<<EOF>>
flex使用的正则表达式标准拥有对于字符类的扩展。合法的扩展字符类有:
[:alnum:] [:alpha:] [:blank:]
[:cntrl:] [:digit:] [:graph:]
[:lower:] [:print:] [:punct:]
[:space:] [:upper:] [:xdigit:]
它们对应的是标准C中提供的isXXX
函数。一些系统不提供isblank()
函数,所以flex把[:blank:]
定义为空格或制表符。
flex提供了一套比较复杂的、用于处理
[a-T]
这种跨越大小写的字符类的逻辑,但我觉得首先能写出这样的字符类就是很不好的事情。规则比较复杂,我这里就不做记录了。
flex还支持对字符类取补集:
[:^alnum:] [:^alpha:] [:^blank:]
[:^cntrl:] [:^digit:] [:^graph:]
[:^lower:] [:^print:] [:^punct:]
[:^space:] [:^upper:] [:^xdigit:]
flex还支持两个的集合运算符:
{-}
:所有在左侧集合且不在右侧集合中的元素,左结合{+}
:所有在左侧集合或在右侧集合的元素,左结合