在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 7058|回复: 8

[转贴] perl/pcre正则表达式元字符/转义字符/量词/匹配方式

[复制链接]
发表于 2012-11-21 16:31:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
Linux平台上被广泛使用的正则表达式库PCRE - Perl-compatible regular expressions,从其名字即可知道,PCRE提供的是一套与Perl中相兼容的正则表达式。元字符(Meta-character)
  • '\' : 引用下一个元字符
  • '^' : 行首
  • '.' : 除新行(newline)外的任一字符('/s'选项将使'.'匹配新行字符)
  • '$' : 行尾(或结尾处新行之前字符)
  • '|' : 可选项
  • '('与')' : 分组
  • '['与']' : 字符类。表示一类字符集合中任意一个,方括号内可使用'-'表示范围,如[0-9]; 也可使用'^表示求补集,如[^0-9]表示除0-9外的其他字符



量词(Quantifier)
  • '*' : 0或任意次
  • '+' : 1或更多次
  • '?' : 0或1次
  • {n} : n次
  • {n,} : 至少n次
  • {n, m} : n到m次

匹配方式
  • 贪婪(greedy)方式:在模式其余部分匹配前提下,尽可能多地匹配字符
  • 最少匹配(minimum): 尽可能少地匹配。量词后使用'?'表示使用最少匹配方式
  • 占有式:与贪婪方式相近,尽可能多地匹配字符,但绝不回退(backtrack,即使模式其余部分无法匹配,也不减少本部分的匹配数量)。在数量词之后使用'+'表示使用占有式匹配。

转义序列
  • '\t' : 制表符(HT, TAB)
  • '\n' : 换行(LF, NL)
  • '\r' : 回车(CR)
  • '\f' : 进纸(Form Feed, FF)
  • '\a' : 报警 (Alarm, BEL)
  • '\e' : 转义(ESC)
  • "\0xx" : 八进制数值对应字符,如\033表示ESC
  • "\xhh" : 16进制数值对应字符,如\x1B表示ESC
  • "\x{hhhh}" : 16进制long型数值对应字符,如\x{263a}表示unicode SMILEY
  • "\cK" : K可以为任意字母,表示控制字符"control-K","\cK"表示如VT
  • "\N{name}" : unicode命名字符
  • "\N{U+hhhh}" : unicode字符
  • '\l' : 小写下一字符
  • '\u' : 大写下一字符
  • '\L' : 小写随后字符串直至'\E'
  • '\U' : 大写随后字符串直至'\E'
  • '\E' : 结束大小写转换
  • '\Q' : 引用随后字符(禁止转义)直至'\E'

字符类及其他转义字符
  • '\w' : 匹任任一单词(word)字符(26个英文字母、10个数字,加下划线'_')
  • '\W' : 匹配任一非单词字母
  • '\s' : 任一空白字符(空格' ', 制表符'\t'等)
  • '\S' : 任一非空白字符
  • '\d' : 任一数字字符[0-9]
  • '\D' : 任一非数字字符
  • “\pP” : 匹配命名属性P
  • "\PP" : 匹配非P
  • '\X' : 匹配unicode扩展字符集(eXtended grapheme cluster)
  • '\C' : 匹配单个C字符(字节),即使工作在unicode模式下
  • '\n' : n为数字,后向引用指定组n
  • "\gn" : 后向引用指定组n
  • "\g{-n}" : 表示相对(当前位置之前的)第n个后用引用组n
  • "\g{name}" : 后向引用命名组(name)
  • "\k{name}" : 后向引用
  • '\K' : 使\K左侧部分,不引入到$&中
  • '\N' : 除'\n'外的任一字符
  • '\v' : 垂直空白符
  • '\V' : 非垂直空白符
  • '\h' : 水平空白符
  • '\H' : 非水平空白符
  • '\R' : 行分割符号

POSIX字符类
POSIX字符类表示语法:[:class:], 在pattern中则必须写为"[[:class:]]"。
  • "[[:alpha:]]" : (英文)字母
  • "[[:alnum:]]" : 字母或数字字符
  • "[[:ascii:]]" : ASCII字符集中字符
  • "[[:blank:]]" : GNU扩展,等价于空格' '或水平制表符'\t'
  • "[[:cntrl:]]" : 任一控制字符
  • "[[:digit:]]" : 任一数字字符,等价于'\d'
  • "[[:graph:]]" : 除空格外的任一可打印字符
  • "[[:lower:]]" : 任一小写字符
  • "[[:print:]]" : 任一可打印字符,包括空格
  • "[[:punct:]]" : 除单词字符(字母,'_')外的任一图形字符
  • "[[:space:]]" : 任一空白字符,等价于'\s'垂直制表符"\cK"
  • "[[:upper:]]" : 任一大写字符
  • "[[:word:]]" : Perl扩展, 等价于'\w'
  • "[[:xdigit:]]" : 任一16进制数字


Perl中,"[[^:class:]]"表示posix指定类的补集,这种情况下也可略去[::],在类名前加'^'表示为"[^class]"。Assertion
  • '\b' : 单词边界
  • '\B' : 非单词边界
  • '\A' : 字符串首
  • '\Z' : 字符串尾或尾部换行字符之前
  • '\z' : 字符串尾
  • '\G' : 在上一个匹配处进行匹配
发表于 2012-11-21 21:55:14 | 显示全部楼层
回复 1# 射门靴


    学习了!
发表于 2012-11-22 22:52:56 | 显示全部楼层
掌握正则表达式,可以节省很多编码的时间!
发表于 2013-1-23 09:45:03 | 显示全部楼层
回复 1# 射门靴


最近工作上需要用Perl来处理一个文件,文件里面含有以“fpga”开头 以“,”结尾的字符,比如:fpga_usb_a,  fpga_iic_b,等,现在想要把这些字符给删掉,请问该如何写这样的脚本。我是刚刚接触perl,用了m//匹配符,想找到这些字符并提取出来,但是每次得到的都是这些字符所在的整个一行,而不是特定的字符串。麻烦LZ给点指导,谢谢
 楼主| 发表于 2013-1-25 16:49:24 | 显示全部楼层
回复 4# hzdzkjly

试试用 非贪婪数量 符 去匹配你要替换的字段    /fpga.*?\,/

如果不用非贪婪数量符 /fpga.*\,/ 则匹配的是红色的部分,开始的fpga和最后的逗号

fpga_usb_a, xxxxxxxx, xxxxxx, fpga_iic_b, xxxx,xxxxx,


不知道这能不能重现你的case,  不一样的话,把你的代码贴上来,这样比较直接
发表于 2013-1-27 21:37:17 | 显示全部楼层
回复 5# 射门靴


    我试过了,可以的。谢谢了
发表于 2013-2-21 15:58:09 | 显示全部楼层
hao hao xue xi yi xia a
发表于 2013-3-11 12:37:37 | 显示全部楼层
努力学习~~
发表于 2013-4-6 08:24:16 | 显示全部楼层
多谢楼主了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-18 20:46 , Processed in 0.029356 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表