度量快速开发平台-业界最好的全功能软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 177|回复: 1

[分享] 正则表达式简介

[复制链接]

170

主题

1870

帖子

4272

积分

论坛元老

Rank: 8Rank: 8

积分
4272
发表于 2017-6-6 14:56:06 | 显示全部楼层 |阅读模式
正则表达式:是由普通字符以及特殊字符组成的文字模式,它描述了一种字符串匹配的规则,可以用来检查一个字符串是否包含某个子串,将某个字符串替换或者从字符串中提取出某个子串。构建正则表达式和数学表达式一样,可以将小的表达式组合来构建更大的表达式。
普通字符:普通字符包括没有显示指定为元字符的所有可打印和不可打印字符,这包括所有大写和小写字母,所有数字,所有标点符号和一些其他符号。
非打印字符非打印字符说明
\cx 匹配由x指明的控制字符。例如 \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
\t 匹配一个制表符。等价于 \x09 和 \cI
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK
特殊字符:一些有特殊含义的字符,如通配符“*”,这些字符如果要在字符串中查找需要使用转义字符,也就是反斜杠\。
通配符 特殊字符 描述
$ 匹配输入字符串的结尾位置。
() 标记一个子表达式的开始和结束。
* 匹配前面子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
. 匹配除换行符\n之外的任何单字符。
[ 标记一个中括号表达式的开始。
? 匹配前面的子表达式一次或零次或指明一个非贪婪限定符。
\ 将下一个字符标记为特殊字符、或元义字符、或向后引用、或八进制转义符。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。
{ 标记限定符表达式的开始。
| 指明两项之间的一个选择。
限定符:限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配次数不固定,主要包括{0 or 1},{1 or n},{0 or 1},{n},{大于等于n},{大于等于n,小于等于m}六种。对应表达式分别是*,+,?,{n},{n,},{n,m}。
限定符限定符描述
*匹配前面的子表达式零次或多次。
+匹配前面的表达式一次或多次。
匹配前面的子表达式零次或一次。
{n}n是一个非负整数,匹配确定的n次。
{n,}n是一个非负整数,至少匹配n次。
{n,m}m,n是非负整数,n<=m,最少匹配n次,最多匹配m次。注意在“,”和两个数之间不能有空格。
定位符: 定位符能够使我们将正则表达式固定到行首或行尾。同时还可以创建特殊的表达式,例如:正则表达式出现在一个单词内或者一个单词开头或一个但多次结尾。定位符用来描述字符串或者单词的边界。
定位符字符描述
^匹配输入字符串的开始位置。如果设置RegExp为Multiline属性,还可以与\n和\r之后的位置匹配。
$匹配输入字符串结尾的位置。如果设置RegExp为Multiline属性,还可以与\n和\r之后的位置匹配。
\b匹配一个字边界,即字与空格间的位置。
\B非字边界匹配。
注意:不能将限定符与定位点一起使用,由于在靠近换行或者字边界的前面或后面不能有一个以上的位置,因此不允许“^*之类的表达式”。
若要匹配一行文本开始处的文本,应该将^置于正则表达式开始;若要匹配一行文本结尾处的文本,则在正则表达式的结尾处使用$。不要将 ^ 或者$的这种用法与中括号表达式内的用法混淆。
eg:
/^Chapter [1-9][0-9]{0,1}/匹配章节标题为两位数的以Chapter开头的标题;
/^Chapter [1-9][0-9]{0,1}$/匹配开始和结尾都为章节标题,也就是说这一行只有章节标题;
/\bCha/匹配字边界,也就是说以Cha开头的边界;
/ter\b/结尾是ter的单词。
/\Bapt/,匹配非字边界,比如chapter中的apt匹配,但是aptitude中的就不匹配;
选择:用圆括号将所有项括起来,相邻的选择之间用|分隔。但是使用圆括号有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用;
非捕获元:
?:消除不想要的缓存副作用,放在选择项的第一个选项之前。
?=正向预查,在任何开始匹配圆括号内的正则模式的位置来匹配搜索字符串。
?!反向预查,在任何开始不匹配该正则模式的位置来匹配搜索字符串。
反向引用:(莫名想到了C语言里面的递归。。。)我觉得通俗的讲,反向引用,就是引用已经被缓存的模式也就是后文中的通过\n来对缓冲区进行访问。对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中(类似于子串,记得开始时有说过,正则就像数学表达式,由小的简单的表达式组合成为大的复杂的表达式,这些临时缓冲区可以理解为那些小表达式的匹配结果),所捕获的每个子匹配都按照在表达式中从左到右的顺序存储。缓冲区编号从1开始,最多可存储99个捕获的子表达式。每个缓冲区都可用\n来访问,其中n为一个标识特定缓冲区的一位或二位十进制数。可以使用非捕获元字符?:,?=,?!来重写捕获,忽略对相关匹配的缓存。
反向引用最简单最有用的应用之一,是提供查找文本中两个相同的相邻单词的匹配项的能力:


回复

使用道具 举报

170

主题

1870

帖子

4272

积分

论坛元老

Rank: 8Rank: 8

积分
4272
 楼主| 发表于 2017-6-6 14:56:39 | 显示全部楼层
字数超了点
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2018-1-19 19:17 , Processed in 0.292796 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表