被GNU开源项目flex所使用的扩展正则表达式

  • 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时的启动条件是s1s2s3中的任意一个
  • <*>r:匹配r时启动条件任意
  • <<EOF>>:文件结尾
  • <s1,s2><<EOF>>:启动条件为s1s2时匹配<<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还支持两个的集合运算符:

  • {-}:所有在左侧集合且不在右侧集合中的元素,左结合
  • {+}:所有在左侧集合或在右侧集合的元素,左结合
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值