regex - POSIX 1003.2 正则表达式
DESCRIPTION
正则表达式 (``RE''s), 在 POSIX 1003.2 中定义,包含两种类型:新式 REs (基本上指的是 egrep 使用的那些,1003.2 称其为 ``extended'' REs 也就是“扩展的REs”) 和旧式 REs (指的是 ed(1) 中的那些,1003.2 称之为 ``basic'' REs 也就是“基本的REs”). 旧式 REs 的存在仅仅是为了向后和一些旧程序保持兼容;在最后将加以讨论。 1003.2 对 RE 语法和语义的某些方面没有做强制规定; `(!)' 记号标示了这些内容,它们可能不能完全移植到其他 1003.2 实现当中。
一个(新式的) RE 正则表达式是一个(!) 或多个非空(!) branches 分支,以 `|' 分隔。它匹配任何匹配其中一个分支的符号串。
一个 branch 分支是一个(!) 或多个 pieces 片段连结而成。符号串首先要匹配它的第一个片段,接下来剩余部分再匹配第二个片段,以此类推。
一个 piece 片段是一个 atom 原子,其后可能包含一个(!) `*', `+', `?', 或者 bound 量词。一个原子加上 `*' 匹配零个或多个这个原子的匹配构成的序列。一个原子加上 `+' 匹配一个或多个这个原子的匹配构成的序列。一个原子加上 `?' 匹配零个或一个这个原子的匹配。
一个 bound 量词是 `{' 后面跟一个无符号十进制整数,可能还会跟一个 `,',可能还会再跟一个无符号十进制整数,然后以 `}' 结束。整数的大小必须在 0 和 RE_DUP_MAX (255(!)) 之间(包含边界值)。如果给出了两个数字,那么第一个决不能比第二个大。一个原子的量词中如果只有一个数字而没有逗号的话,就匹配 i 个这个原子的匹配构成的序列。一个原子的量词中如果只有一个数字并且有逗号的话,就匹配 i 个或多个这个原子的匹配构成的序列。一个原子的量词中如果包含两个数字 i 和 j 的话,就匹配 i 到 j 个这个原子的匹配构成的序列。
一个原子是一个包含在 `()' 中的正则表达式 (这将匹配这个正则表达式匹配的符号串),一个空的 `()' (匹配空串),一个 bracket expression (方括号表达式,参见下面), `.' (匹配任何字符), `^' (匹配行首的空字符串), `$' (匹配行尾的空字符串),一个 `\' 加上下列字符之一 `^.[$()|*+?{\' (匹配这个字符,忽略它的任何特殊意义),一个 `\' (加上任何其他字符(!) 匹配那个字符,忽略它的任何特殊意义,就好像 `\' 不存在(!)),或者是一个字符,没有特殊意义 (匹配它本身)。一个 `{' 后面是一个非数字的字符时,是一个普通的字符而不是量词的开始(!)。以 `\' 来结束一个 RE 是非法的。
一个 bracket expression 方括号表达式是一个字符的列表,包含在 `[]' 当中。它一般匹配列表中的任何一个字符 (有特殊情况)。如果这个列表以 `^' 开始,它将匹配 不在 列表中的任何字符 (下面还会讲到特殊情况)。如果列表中的两个字符以 `-' 分隔,可以表示字母表中这两个字符之间(包括这两个字符)所有的字符。例如,ASCII 字符表中 `[0-9]' 匹配任何数字。不能(!) 用一个字符作为定义两个字符范围的端点,就像这样 `a-c-e'。字符范围是与字母表顺序相关的,可移植的程序不应使用它们。
要在列表中包含一个字面的(没有特殊含义的) `]',可以把它放在首位(后面可能要加上一个`^')。要在列表中包含一个字面的 `-',可以把它放在首位或末尾,或者让它作为一个字符范围的末端点。要以一个字面的 `-' 作为字符范围的起始,可以将它放在 `[.' 和 `.]' 当中,使得它成为一个 collating element (归并元素,参见下面)。特殊情况除了这些,还有使用 `[' 的组合(参见下一段)。所有其他特殊字符,包括 `\' 在内,在方括号表达式中都失去了它们的特殊含义。
方括号表达式中,一个包含在 `[.' 和 `.]' 中的归并元素 (collating element,一个字符,一个视为一体的字符序列,或者一个代表着上述两类的归并序列名称) 代表着这个归并元素所包含的字符序列。这个序列被视为方括号表达式的一个元素。因此一个包含着多字符归并元素的方括号表达式可以匹配多于一个的字符。例如,如果这个归并序列包含一个归并元素 `ch',那么正则表达式 `[[.ch.]]'*c' 可以匹配 `chchcc' 的前五个字符。
方括号表达式中,一个包含在 `[=' 和 `=]' 中的归并元素是一个等价类,代表着等价于它的所有归并元素 (也包括它自身)包含的字符的序列。 (如果没有其他等价的归并元素,就把它与括号分隔符是 `[.' 和 `.]' 时同样看待。) 例如,如果 o 和 是一个等价类的成员,那么 `[[=o=]]',`[[==]]' 还有 `[o]' 都是同义词。一个等价类不能(!) 是一个字符范围的末端点。
方括号表达式中,包含在 `[:' 和 `:]' 中的一个 character class(字符类) 代表着这个字符类中的所有字符的列表。标准的字符类名称是:
-
alnum digitpunct
alpha graphspace
blank lowerupper
cntrl printxdigit
它们代表着 wctype(3) 定义的字符类。一个 locale(语言环境) 可能会提供其他字符类。一个字符类不能用作一个字符范围的末端点。
方括号表达式还有两种特殊的情况(!) :方括号表达式 `[[:<:]]' 和 `[[:>:]]' 分别匹配一个词的开始和结尾的空字符串。一个 word (词)是一个 word character (成词字符) 的序列,并且前后都没有成词字符。一个 word character (成词字符) 是一个 alnum 字符 (在 wctype(3) 中有定义) 或者是一个下划线。这是一个扩展,与 POSIX 1003.2 兼容但没有写入正文,在需要移植到其他系统中的软件中应当小心使用。
如果一个 RE 可以匹配一个字符串的多个不同的字串时,RE 选择匹配最前面的一个。如果这个 RE 匹配的子串有相同的起始点,RE 选择匹配最长的一个。子表达式也匹配最长的字串,使得整个匹配的字串最长,RE 中前面的子表达式比后面的子表达式优先级高。注意高级的子表达式比组成它的子表达式优先级要高。
匹配长度以字符来计算,而不是归并元素。空字符串被认为比没有匹配要长。例如,`bb*' 匹配 `abbbc' 的中间三个字符; `(wee|week)(knights|nights)' 匹配 `weeknights' 的全部十个字符; `(.*).*' 匹配 `abc',其中括号中的子表达式匹配所有这三个字符; `(a*)*' 来和 `bc' 匹配时,括号中的子表达式和整个 RE 都匹配空字符串。
如果指定了 case-indepentent 忽略大小写的匹配,效果是字母表中的大小写区别似乎都消失了。如果一个字母可能以两种情况出现,假如它出现在方括号表达式之外,实际上被替换成了一个包含所有情况的方括号表达式,例如 `x' 成为了 `[xX]';如果它出现在方括号表达式之内,那么它的所有形式都被加入到这个方括号表达式之内,因此例如 `[x]' 等同于 `[xX]',还有 `[^x]' 成为了 `[^xX]'。
对 RE 的长度没有强制的限制。需要可移植的程序不应当使用长于256字节的正则表达式,因为特定的实现可以不接受这种 RE,但是仍然是 POSIX 兼容的。
过时的 (``basic'') 正则表达式在很多地方有不同之处。`|',`+' 和 `?' 是普通的字符,并且没有和它们等价的功能。量词的分隔符是 `\{' 和 `\}',`{' 和 `}' 本身是普通的字符。嵌套的子表达式使用的括号是 `\(' 和 `\)',`(' 和 `)' 本身是普通的字符。 `^' 是一个普通的字符,除非是 RE 的第一个字符,或者(!) 一个括号中的子表达式的第一个字符。 `$' 是一个普通的字符,除非是 RE 的最后一个字符,或者(!) 一个括号中的子表达式的最后一个字符。 `*' 是一个普通的字符,如果它出现在 RE 的开始,或者一个括号中的子表达式的开始(其后一般是一个 `^')。最后,还有一类 atom 原子,一个 back reference(向后引用):`\' 其后跟一个非零十进制整数 d,匹配与第 d 个括号中的子表达式的匹配相同的内容(子表达式的编号是根据它们的左括号而来,从左到右)。因此(例如),`\([bc]\)\1' 匹配 `bb' 或 `cc' 但是不匹配 `bc'。
regex - POSIX 1003.2 正则表达式的更多相关文章
- Regex分组与Pattern正则表达式对象
1.正则规则: 1.String regex = "[1-9]" 表示单个字符的取值范围是 1~9,注意是单个字符的取值范围 2 ...
- String replaceAll(String regex,String str)满足正则表达式的部分替换为给定内容
package seday02;/*** * String replaceAll(String regex,String str)* @author xingsir*/public class Rep ...
- 在Emacs中使用GNU Global
背景 在我平时用Emacs编写C代码时,经常需要进行代码的跳转,主要需求为函数定义的跳转,某个具体函数的调用查找,某个结构体的定义跳转以及结构体中具体某一项的跳转等,GNU Global就能完全满足我 ...
- linux find -regex 使用正则表达式
find之强大毋庸置疑,此处只是带领大家一窥find门径,更详细的说明见man find和 info find.整篇文章循序渐进,从最常用的文件名测试项开始步步深入,到第六节基本讲完find处理文件 ...
- [转帖]linux find -regex 使用正则表达式
linux find -regex 使用正则表达式 https://www.cnblogs.com/jiangzhaowei/p/5451173.html find之强大毋庸置疑,此处只是带领大家一窥 ...
- POSIX基本正则表达式和扩展正则表达式的比较
转自:http://book.51cto.com/art/201303/385961.htm 在读者正觉得正则表达式已经复杂得不能再复杂时,又会发现POSIX规范将正则表达式的实现方法分为了两种:基本 ...
- C#正则表达式Regex类的用法
C#正则表达式Regex类的用法 更多2014/2/18 来源:C#学习浏览量:36891 学习标签: 正则表达式 Regex 本文导读:正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串, ...
- Linux/Unix工具与正则表达式的POSIX规范
http://www.infoq.com/cn/news/2011/07/regular-expressions-6-POSIX 对正则表达式有基本了解的读者,一定不会陌生『\d』.『[a-z]+』之 ...
- C++ regex库的三种正则表达式操作
关于正则表达式的语法和字符含义,网上已经有很不错的博客教学,我当初参考的是 读懂正则表达式就这么简单 - Zery - 博客(http://www.cnblogs.com/zery/p/3438845 ...
随机推荐
- django之创建子应用
一:子应用 Django的视图编写是放在子应用中的.类似于flask中的视图. 二:创建子应用 例如:在刚才的dj_study项目中,创建一个名字为user的子应用(目录):注意是第一级的dj_stu ...
- MySQL数据库的自动备份与数据库被破坏后的恢复1
一.前言: 当数据库服务器建立好以后,我们首先要做的不是考虑要在这个支持数据库的服务器运行哪些受MySQL提携的程序,而是当数据库遭到破坏后,怎样安然恢复到最后一次正常的状态,使得数据的损失达到最小. ...
- [POJ 1911] 棋盘
问题描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次切割都只能沿着 ...
- ubuntu + JetSonNano+OpenCV3.4.8
首先强调一点,如果要配置darknet环境,不建议安装该版本!!! 安装opencv前,建议先检测自己的系统是否已经装过其他版本, 检查方式: (1)查看是否安装opencv库: pkg-config ...
- Promise和async/await
1.promise对象 promise 对象有三种状态:pending(进行中).fulfilled(已成功)和 rejected(已失败).promise 对象的状态改变,只有两种可能:从 pend ...
- HDU | Friend Chains-4460 SPFA
题目: Problem DescriptionFor a group of people, there is an idea that everyone is equals to or less th ...
- QT | 第二章 基本语法
''' @Modify Time @Author ------------ ------- python基本语法 2019/10/26 8:16 laoalo ''' import functools ...
- HDU 1003 解题报告
问题描述:求最大连续字串 分析:一道简单的DP,状态转移方程是d[i] = ( d[i-1]+a[i] > a[i] ) ? d[i-1]+a[i] : a[i] d[i]表示以第i个数字结尾的 ...
- day24—JavaScript实现导航栏底部引线跟随移动
转行学开发,代码100天——2018-04-09 前面的学习笔记中记录过,利用:before和:after实现导航栏鼠标移动跟随效果,今天通过JavaScript代码实现同样的效果,以作对比. < ...
- Vagrant 入门 - 同步目录(synced folders)
原文地址 尽管可以非常轻松的启动一台虚拟机,但很少有人希望通过 SSH 使用基于终端的编辑器来编辑文件.幸运的是,借助 Vagrant 你不需要这样做.通过使用同步目录,Vagrant 会自动同步 g ...