正则表达式——POSIX字符组
前面介绍了常用的字符组,但是在某些文档中,你可能会发现类似[:digit:]、[:lower:]之类的字符组,看起来不难理解(digit就是"数字",lower就是"小写"),但又很奇怪,它们就是POSIX字符组(POSIX Character Class)。因为某些语言的文档中出现了这些字符组,为避免困惑,这里有必要做个简要介绍。如果只使用常用的编程语言,可以忽略文档中的POSIX字符组,也可以忽略本节;如果想了解POSIX字符组,或者需要在Linux/UNIX下的各种工具(sed、awk、grep等)中使用正则表达式,最好阅读本节。
之前介绍的字符组,都属于Perl衍生出来的正则表达式流派(Flavor),这个流派叫做PCRE(Per Compatible Regular Expression)。在此之外,正则表达式还有其他流派,比如POSIX(Portable Operating System Interface for uniX),它是一系列规范,定义了UNIX操作系统应当支持的功能,其中也包括关于正则表达式的规范,[:digit:]之类的字符组就是遵循POSIX规范的字符组。
常见的[a-z]形式的字符组,在POSIX规范中仍然获得支持,它的准确名称是POSIX方括号表达式(POSIX bracket expression),主要用在UNIX/Linux系统中。POSIX方括号表达式与之前所说的字符组最主要的差别在于:在POSIX字符组中,反斜线\不是用来转义的。所以POSIX方括号表达式[\d]只能匹配\和d两个字符,而不是[0-9]对应的数字字符。
为了解决字符组中特殊意义字符的转义问题,POSIX方括号表达式规定:如果要在字符组中表达字符](而不是作为字符组的结束标记),应当让它紧跟在字符组的开方括号之后,所以[]a]能匹配的字符就是]或a;如果要在字符组中标识字符-(而不是"-范围表示法"),就必须将它放在字符组的闭方括号]之前,所以[a-]能匹配的字符就是a或-。
另一方面,POSIX规范还定义了POSIX字符组(POSIX character class),它大致等于之前介绍的字符组简记法,都是使用类似[:digit:]、[:lower:]之类有明确意义的记号表示某类字符。
表1-2简要介绍了POSIX字符组,注意表格中与其对应的是ASCII字符组,也就是能匹配的ASCII字符(ASCII编码表中码值在0~127之间的字符)。因为POSIX规范中有一个重要概念:locale(通常翻译为"语言环境"),它是一组与语言和文化相关的设定,包括日期格式、货币币值、字符编码等。POSIX字符组的意义会根据locale的变化而变化,表1-2介绍的只是这些POSIX字符组在ASCII编码中的意义;如果换用其他的locale(比如使用Unicode字符集),它们的意义可能会发生变化,具体请参考第129页。
表1-2 POSIX字符组
|
POSIX字符组 |
说明 |
ASCII字符组 |
等价的PCRE 简记法 |
|
[:alnum:]* |
字母字符和数字字符 |
[a-zA-Z0-9] |
|
|
[:ASCII:] |
ASCII字符 |
[\x00-\x7F] |
|
|
[:alpha:] |
字母 |
[a-zA-Z] |
|
|
[:blank:] |
空格字符和 制表符 |
[ \t] |
|
|
[:cntrl:] |
控制字符 |
[\x00-\x1F\x7F] |
|
|
[:digit:] |
数字字符 |
[0-9] |
\d |
|
[:graph:] |
空白字符之 外的字符 |
[\x21-\x7E] |
|
|
[:lower:] |
小写字母字符 |
[a-z] |
|
|
[:print:] |
类似[:graph:],但包括空白字符 |
[\x20-\x7E] |
|
|
[:punct:] |
标点符号 |
[][!"#$%&'()*+,./:;<=>?@\^_`{|}~-] |
|
|
[:space:] |
空白字符 |
[ \t\r\n\v\f] |
\s |
|
[:upper:] |
大写字母字符 |
[A-Z] |
|
|
[:word:]* |
字母字符 |
[A-Za-z0-9_] |
\w |
|
[:xdigit:] |
十六进制字符 |
[A-Fa-f0-9] |
注:标记*的字符组简记法并不是POSIX规范中的,但使用很多,一般语言中都提供,文档中也会出现。
POSIX字符组的使用也与PCRE字符组简记法的使用有所不同,主要区别在于,PCRE字符组简记法可以脱离方括号直接出现,而POSIX字符组必须出现在方括号内。所以同样是匹配数字字符,PCRE中可以直接写\d,而POSIX字符组必须写成[[:digit:]]。
在本书介绍的6种语言中,Java、PHP、Ruby支持使用POSIX字符组。
在PHP中可以直接使用POSIX字符组,但是PHP中的POSIX字符组只识别ASCII字符,也就是说,任何非ASCII字符(比如中文字符)都不能由任何一个POSIX字符组匹配。
Ruby的情况稍微复杂一点。Ruby 1.8中的POSIX字符组只能匹配ASCII字符,而且不支持[:word:]和[:ASCII:];Ruby 1.9中的POSIX字符组可以匹配Unicode字符,而且支持[:word:]和[:ASCII:]。
Java中的情况更加复杂。POSIX字符组[[:name:]]必须使用\p{name}的形式,其中name为POSIX字符组对应的名字,比如[:space:]就应当写作\p{Space},请注意第一个字母要大写,其他POSIX字符组都是这样,只有[:xdigit:]要写作\p{XDigit}。并且Java中的POSIX字符组,只能匹配ASCII字符。
正则表达式——POSIX字符组的更多相关文章
- java正则表达式中的POSIX 字符类和Unicode 块和类别的类介绍
假如现在有一个需求,要你用Java语言来匹配出一个文本里面的所有(英文半角)标点符号,你会怎么写呢?我想大多数人应该是把这些符号都罗列出来, 如: !"#$%&'()*+,-./:; ...
- [ ] 字符组(Character Classes) (转)
[]能够匹配所包含的一系列字符中的任意一个.需要注意的是,[]虽然能匹配其中的任意一个字符,但匹配的结果只能是一个字符,不是多个. 例如[abc]表示字符“a”或“b”或“c”. []支持用连字符“- ...
- C# -- 正则表达式匹配字符之含义
C#正则表达式匹配字符之含义 1.正则表达式的作用:用来描述字符串的特征. 2.各个匹配字符的含义: . :表示除\n以外的单个字符 [ ] :表示在字符数组[]中罗列出来的字符任意取单个 | ...
- python正则表达式模块re:正则表达式常用字符、常用可选标志位、group与groups、match、search、sub、split,findall、compile、特殊字符转义
本文内容: 正则表达式常用字符. 常用可选标志位. group与groups. match. search. sub. split findall. compile 特殊字符转义 一些现实例子 首发时 ...
- 正则指引-字符组demo
class Program { static void Main(string[] args) { string str = "b"; var result1 = Regex.Is ...
- POSIX字符类
POSIX字符类需要用引号,或双括号[[]]括起来: [:alnum:]:匹配字面和数字字符.等同于A~Z,a~z,0~9 [:alpha:]:匹配字母字符.等同于A~Z,a~z [:blank:]: ...
- c语言-三字符组
C 源程序源字符集在 7 位 ASCII 字符集中包含,但设置为 ISO 646-1983 固定的代码的超集. 三字符序列允许 C 程序编写使用 " 仅 ISO (国际标准组织的固定的代码. ...
- Linux学习——shell编程之正则表达式和字符处理命令
shell编程之正则表达式 一 正则表达式 1 什么是正则表达式 正则表达式用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分隔.匹配.查找及替换操作. 2 shell编程之正则表达式 ...
- shell编程值之正则表达式与字符截取(6)
正则表达式与通配符 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式 通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find.cp ...
随机推荐
- html常用标签、包含关系、常用术语,以及网页设计中的字体分类
编程比较舒适的等宽字体:DejaVu Sans Mono 字体的分类: serif (衬线字体){在笔画上面有些特殊的修饰效果} sans-serif (非衬线字体){横平竖直.横就是横,点就是点} ...
- 基于ELK进行邮箱访问日志的分析
公司希望能够搭建自己的日志分析系统.现在基于ELK的技术分析日志的公司越来越多,在此也记录一下我利用ELK搭建的日志分析系统. 系统搭建 系统主要是基于elasticsearch+logstash+f ...
- sass和less的对比
); < { ; { { ; } ); } ); } ); // if 条件 @dr: if(@my-option = true, { button { ...
- 什么是CPC,CPA,CVR,CTR,ROI
合格的网络营销人员都应该熟悉下面的常见英文缩写,这些都是我们必须知道的名词解释:CVR (Click Value Rate): 转化率,衡量CPA广告效果的指标CTR (Click Through R ...
- HBase(一)——HBase介绍
HBase介绍 1.关系型数据库与非关系型数据库 (1)关系型数据库 关系型数据库最典型的数据机构是表,由二维表及其之间的联系所组成的一个数据组织 优点: 1.易于维护:都是使用表结构,格 ...
- 03javascript01
1.javascript语法体系 1)EMCA基础语法(统一) 2)BOM编程(不统一) 3)DOM编程(不统一) 1.1 javascript使用 <!DOCTYPE html> < ...
- 10年前文章_ vi编辑器查找与替换方法
vi编辑器查找与替换方法1.查找:/ 当前行往下找:? 当前行往上找找到后继续查找同方向 n反方向 N2.替换格式: range s/source/target/g解释:range表示要搜索的范围 & ...
- [编译原理]用BDD方式开发lisp解释器(编译器)|开发语言java|Groovy|Spock
lisp是一门简单又强大的语言,其语法极其简单: (+ 1 2 ) 上面的意思 是:+是方法或函数,1 ,2 是参数,fn=1+2,即对1,2进行相加求值,结果是:3 双括号用来提醒解释器开始和结束. ...
- python字典总结
今天总结一篇关于字典的知识点> 字典也是python提供的一种常用的数据结构,它用于存放具有映射关系的数据 比如成绩表,语文:34,数学:99,如果单纯的使用两个列表保存这组数据,则无法记录两组 ...
- Word快捷选取
在word中,你知道鼠标单击选中一个词,双击选中一行,三击选中一个段落吗?