正则表示式

以前看到别人正则里写(?=),(?!)...这些,觉得云里雾里,完全不知道什么意思,今天突然搜到专门介绍的文章,看完后,有一种拨开云雾见月明的感觉。特此分享下。

正则表达式有俩种特别的情况:

 1. 零宽断言:用于查找在某些内容(但不包括这些内容)之前或之后出现的字符,也就是说像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。

  (?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置后面能匹配表达式exp。如:\b\w+(?=ing\b)匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I‘m singing while you‘re dancing.时,它会匹配sing和danc。

(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置前面能匹配表达式exp。如:(?<=\bre)\w+\b会匹配以re开头的单词的后面部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。

   假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})+\b,用它对xxxxxxxxxx进行查找时结果是xxxxxxxxxx

下面这个例子同时使用了这两种断言:(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)

断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。

  2. 负向零宽:如果我们只是想要确保某个字符没有出现,但是不想去匹配它是怎么办?

   例如我们想查找这样的单词:它里面出现了字母q,但是q后面跟的不是字母u。我们可以尝试这样:\b\w*q[^u]\w*\b匹配包含字母q后面不是字母u的单词,但是如果多做测试(或者你思维足够敏锐,直接就观察出来了),你会发现,如果q出单词的结尾的话,像Iraq,Benq,这个表达式就会出错。因为[^u]总要去匹配一个字符,当字母q出现在最后的话,[^u]就会去匹配q后面的单词分隔符(可能是空格,句号,或者其它什么的),后面的\w*\b将会匹配下一个单词,于是\b\w*q[^u]\w*\b就能匹配整个Iraq fighting。负向零宽断言能解决这样的问题,因为它只匹配一个位置,不消耗任何字符。我们可以这样来解决这个问题:\b\w*q(?!u)\w*\b。

(?!exp)零宽度负预测先行断言,断言此后面的位置不能匹配表达式exp。例如:\d{3}(?!\d)匹配3为数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。

(?<!exp)零宽度负回顾后发断言,断言此位置的前面不能匹配表达式exp。(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。

一个更复杂的例子:(?<=<(\w+)>).*(?=<\/\1>)这个表达式最能表现零宽断言的真正用途。匹配不包含属性的简单HTML标签内里的内容。 (?<=<(\w+)>)指定了这样的前缀:被尖括号括起来的单词(比如可能是<b>),然后是.*(任意的字符串),最 后是一个后缀(?=<\/\1>)。注意后缀里的\/,它用到了前面提过的字符转义,将”/“转义;\1则是一个反向引用,引用的正是捕获的 第一组,前面的(\w+)匹配的内容,这样如果前缀实际上是<b>的话,后缀就是</b>了。整个表达式匹配的 是<b>和</b>之间的内容(再次提醒,不包括前缀和后缀本身)。

时间: 2024-07-28 13:07:28

正则表示式的相关文章

用正则表示式分析网页

昨晚现学现卖了一下正则表达式,记录一下 爬的网页:http://www.qiushibaike.com/hot/page/1/?s=4930745 首先来看源码 <a href="/users/13145907/" target="_blank" rel="nofollow"> <img src="http://pic.qiushibaike.com/system/avtnew/1314/13145907/medium

对正则表示式及grep的总结

正则表达式学习总结     什么是正则表达式 正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本. 一.正则表达式的各个元字符 (1)字符匹配: . -->表示匹配任意单个字符 [] --> 匹配指定范围内的任意单个字符 [^]:取反 (2)次数匹配元

常用的正则表示式

非负整数:^\d+$ 正整数:^[0-9]*[1-9][0-9]*$ 非正整数:^((-\d+)|(0+))$ 负整数:^-[0-9]*[1-9][0-9]*$ 整数:^-?\d+$ 非负浮点数:^\d+(\.\d+)?$ 正浮点数 : ^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)$ 非正浮点数:^((-\d+\.\d+)?)|(0+(\.0+)?))$ 负浮点数:^(-((正浮点数正则式

python学习-正则表示式及re模块

python中的所有正则表达式函数都在re模块中.import re导入该模块. 1,创建正则表达式对象 想re.compile()传入一个字符串值,表示正则表达式,它将返回一个Regex模式对象. 创建一个匹配手机号的(\d表示一个数字字符) mphone_regex = re.compile(r'\d\d\d-\d\d\d\d-\d\d\d\') 2,匹配正则表达式 regex对象的search()方法查找传入的字符串,寻找该正则表达式的所有匹配.如果字符串中没有找到该正则表达式模式,sea

正则表示式_常用的正则验证

<script type="text/javascript"> /* * 手机号码格式 * 只允许以13.15.18开头的号码 * 如:13012345678.15929224344.18201234676 */ var regMobile=/^1[3,5,8]\d{9}$/; /* * 固定电话号码格式 * 因为固定电话格式比较复杂,情况比较多,主要验证了以下类型 * 如:010-12345678.0912-1234567.(010)-12345678.(0912)123

javascript正則表達式

定义一个正則表達式 能够用字面量 var regex = /xyz/; var regex = /xyz/i; 也能够用构造函数 var regex = new RegExp('xyz'); var regex = new RegExp('xyz', "i"); // 第二个參数表示修饰符 正則表達式组成 直接量字符 直接量字符如\a 特殊含义的字符须要转义 假设使用RegExp方法生成正则对象,转义须要使用两个斜杠.由于字符串内部会先转义一次. (new RegExp("1

正则表达式和grep命令的用法

正则表达式和grep命令的用法: 一.正则表达式: 正则表达式(也称为regular Expression,简称RE)就是由普通字符(例如字符a到z)以及特殊字符(称之为元字符)组成的文字模式. 该模式描述在查找文字主体时待匹配的一个或多个字符串. 正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配.简单的说,正则表示式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表示通过一些特殊符号的辅助,可以让使用者轻易的达到搜寻/删除/取代某特定字符串的处理程序.vim.gr

linux基础入门之文件管理类命令

文件管理类命令 命令和选项 command [options] [arguments] 命令      选项    参数 选项 短选项-   例(-h -l -a) 短选项可组合 例(-hla) 有些命令短选项可以不带-, 通常称作BSD风格的选项 例(ps aux ,tar xf) 有些选项需要带参数 tail -n 2 /etc/passwd 长选项不能组合 --help --list 如果需要参数 长选项的参数通常需要=号  --size=1G 命令后的参数就是命令的作用对象 例:ls /

js常用的4种截取字符串方法

平常经常把这几个api的参数记混了,于是打算记录下来,当不确定的时候在拿出来翻翻: 在做项目的时候,经常会需要截取字符串,所以常用的方法有slice().substr().substring().match()方法等,四个方法的使用如下所示: 1 <script type="text/javascript"> 2 // 截取字符串的方法 3 //注意1.字符串的截取都是从左向右,不会有从右向左截取:2.slice与substring方法,截取返回的字符串包含numStart