攻破难啃的骨头-正则表达式(转)

很多Web开发人员在忽视正则表达式之后,还可以顺利的工作,但很多情况下,一句正确的正则表达式,很有可能省略半屏的代码。

正则表达式的解释

在JavaScript中,与大多数其他对象类型一样,有两种方法可以创建正则表达式:通过正则表达式字面量,或者通过构造RegExp对象的实例。
例如,如果要创建一个一般的正则表达式,用于精确匹配字符创“test”,可以使用正则字面量:

var pattern=/test/;

正斜杠可能看着有些奇怪,但是正如字符创是用引号进行界定一样,正则字面量是用正斜杠进行界定的。
或者,我们可以构造一个RegExp实例,将正则表达式作为字符串传入:

var pattern=new RegExp("test");

在开发过程中,如果正则是已知的,则优先选择字面量语法,而构造器方式则是用于在运行时,通过动态构建字符串来构建正则表达式。字面量语法优先于字符串的其中一个原因是反斜杠字符在普通字符串中也是一个转义字符,多以,我们要用\\来表示反斜杠。
除了表达式本身,还有三个标志可以与正则进行关联:

  • i:让正则表达式不区分大小写。
  • g:匹配模式中的所有实例,而不是默认只匹配第一次出现的结果。
  • m:允许匹配多个行。

这些标志将附加到字面量尾部(/test/ig)或者作为RegExp的第二个字符参数。

术语与操作符

匹配一类字符

  • [abc]:匹配a,b,c中的任何一个字符。
  • [^abc]:匹配除a,b,c以外的任意字符。
  • [a-m]:匹配从a到m的所有字符。

释义

  • /^test/:以test开头的字符串
  • /test$/:表示该模式必须出现在字符串的结尾

重复出现

  • /t?est/:该字符t可出现0次或1次
  • /t+est/:该字符t可出现1次或多次
  • /t*est/:该字符t可出现0次或多次
  • /a{4}/:该字符出现4次
  • /a{4,10}/:包含连续4个至10个a字符的字符串
    这些重复操作符可以是贪婪的也可以是非贪婪的,默认为贪婪的:匹配所有字符组合。在操作符后边加一个问号?字符,如a+?,可以让该表达式成为非贪婪的:进行最小限度的匹配

预定义字符类

预定义术语 匹配内容
\t 水平制表符
\b 空格
\v 垂直制表符
\f 换页符
\r 回车
\n 换行符
. 匹配除了新行之外的任意字符
\d 匹配任意数字,等价于[0~9]
\D 匹配任意非数字,定价与[^0~9]
\w 匹配包括下划线的任意单词字符,等价于[A-Za-z0-9_]
\W 匹配任意非单词字符,等价于[^A-Za-z0-9_]
\s 匹配任何空白字符,包括空格,制表符,换页符等
\S 匹配任意非空白字符
\b 匹配单词边界
\B 匹配非单词边界

分组

如果将操作符应用于一组术语,可以像数学表达式一样在改组上使用小括号。例如:/(ab)+/匹配一个或多个连续出现的子字符串“ab”

或操作符

可以用|字符表示或者的关系。例如/(ab)+|(cd)+/匹配出现一次或多次的“ab”或“cd”。

反向引用

这种术语表示法是在反斜杠后面加一个要引用的捕获数量,该数字从1开始,如\1、\2等。
例如:/^([dtn])a\1/匹配任意一个以d,t或者n开头,且后边跟着一个a字符,并且再后边跟着的是和第一个捕获相同字符的字符串。因此\1匹配的字符需要在执行的时候才能确定。
在匹配XML类型的标记元素的时候它很有用,例如/<(\w+)>(.+)</\1>/,可以匹配像“<strong>shtat</strong>”这样的元素。

编译正则表达式

正则表达式的两个重要阶段是编译和执行,编译发生在正则表达式第一次被创建时,而执行发生在我们使用编译过的正则表达式进行字符串匹配的时候。
正则表达式只创建一次,并将其保存在一个变量中供后续使用,这是一个重要的优化过程。

捕获匹配的片段

简单匹配一个字符创是否匹配一个模式显然是我们需要做的第一步,但在很多情况下,确定匹配的内容也是很有用的。

http://www.cnblogs.com/depsi/p/5163848.html

时间: 2024-10-05 04:25:06

攻破难啃的骨头-正则表达式(转)的相关文章

基于Spark的FPGrowth源码中难啃的骨头

/** Extracts all patterns with valid suffix and minimum count. */ def extract( minCount: Long, validateSuffix: T => Boolean = _ => true): Iterator[(List[T], Long)] = { summaries.iterator.flatMap { case (item, summary) => if (validateSuffix(item)

C语言最难啃的三块硬骨头

C语言最难啃的三块硬骨头提到C语言很多初学者都觉得,学到中间就进行不下去了,因为碰到了几个硬骨头死活翻不过去,于是很多人给C语言下结论太难了,太靠近底层了,特别是那几块难啃的骨头,直接理解不了,进行不下去. 今天就来说下,最难啃的三块骨头,看到底是谁?如果大家如果在自学遇到困难,想找一个C++的学习环境,可以加入我们的C++学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题. C语言最难啃的三块硬骨头内存布局 指针公认最难理解的概念,也是让很多初学者选择放弃的直接原因 指针之所以难

大白话Vue源码系列(01):万事开头难

阅读目录 Vue 的源码目录结构 预备知识 先捡软的捏 Angular 是 Google 亲儿子,React 是 Facebook 小正太,那咱为啥偏偏选择了 Vue 下手,一句话,Vue 是咱见过的最对脾气的 MVVM 框架.之前也使用过 knockout,angular,react 这些框架,但都没有让咱产生 follow 的冲动.直到见到 Vue,简直是一见钟情啊. Vue 的官方文档已经对 Vue 如何使用提供了最好的教程,建议 Vue 新手直接去官网学习,而不要在网上找些质量参差不齐的

CAS

接触CAS有一段时间,一直以来总听到别人说这是块难啃的骨头,于是我饿了,想啃一啃,CAS的原理其实还是比较好理解的,但是在实现的过程中确实出现了很多问题,而且CAS的Server和Client如果版本不合适的话,也会有这样那样的问题.下面和大家共享一下我做Cas的一些feeling. 老师经常说一张图胜过千言万语,在学Cas的理论的时候也同时是一张图让我对CAS有了一个形象的了解:

翻出当年的学习进度汇报邮件——前路不易,且行且珍惜

离回归程序猿行列已经一年又一个月整了,也就是进入现在这家公司已经一年又一个月整.确实是个整数,清清楚楚的记得去年入职时间是3月27日,似乎冥冥中总有那么些凑巧的事情发生.现在的公司是一家创业型公司,接受过一轮风投,从创办至今,时间其实不算短.今年是公司非常关键的一年,总觉得年初至今的项目目标不够明确,甚至有点杂乱.作为一个开发人员兼中层管理,最近这段时间想的比较多.可能由于上个月拼死拼活做的项目因为找不到盈利模式被迫暂停的缘故,最近几个星期尤为浮躁,很难静下心来看书学习. 今天下午一时兴起开始整

Nutch源码阅读进程3

走了一遍Inject和Generate,基本了解了nutch在执行爬取前的一些前期预热工作,包括url的过滤.规则化.分值计算以及其与mapreduce的联系紧密性等,自我感觉nutch的整个流程是很缜密的,起码从前面两个过程看是这样的. 前期回顾:上一期主要是讲解了nutch的第二个环节Generate,该环节主要完成获取将要抓取的url列表,并写入到segments目录下,其中一些细节的处理包括每个job提交前的输入输出以及执行的map和reducer类具体做了那些工作都可以参考上一篇.接下

如何让CMDB配置维护更贴近人性

近来很多行业内的大佬关于CMDB连连发声,CMDB的关注度持续高涨,CMDB的前生就是长满雀斑的丑媳妇,扭扭捏捏不受待见这么多年,终于熬出头要见公婆了.哎,她的贤惠谁能懂? 言归正传,在拜读了多篇大牛的文章发现,提及配置维护的内容很少,有也是一带而过.但在过去和用户的接触过程中,发现配置维护一直是一个无法回避的大难题,一块难啃的骨头.业界产品的普遍做法主要是依靠自动发现+人工维护+流程控制.对于自动发现.流程控制,我想只能解决配置维护的60%的工作,真正出现问题的是占用40%工作量的人工维护.由

我的iphone6退货之路

匆匆这一年又快结束了,眼看年关将近,老婆的生日也快到了,正打算给老婆买个礼物,由于现在老婆用的手机是公司的工程机,而且还是低端产品,所以一直想给老婆改善改善,也算是对老婆这一年来辛苦的默默的支持的一种肯定吧,于是我就开始网上找,哎……最近听说iphone6不错啊,火的不得了, 好吧就肾6了.没有多想打开京东,搜索产品,下单,支付一气呵成,比写代码的感觉还流畅还爽. 话说京东的物流还是很给力的,带着激动的心情收到iphone6plus,看到外观的确比较惊艳,2.5D屏幕,纤细的机身,结果操作了几下

C++ Primer 学习笔记(1)

出于对自己未来的规划和兴趣,一直想学一门编程语言,最终选择了C++这难啃的骨头. 本人13届毕业生,大学所学与计算机可以说毫无关系,所以基础基本为零:工作也和编程无关,不靠它换饭吃:学C++更多出于"未来可能有大用"的想法.自己些许的兴趣和一点点"懂编程应该很厉害的样子"的虚荣心. 刚申请博客时就计划学习<C++ Primer 中文版>第四版,由于公司培训计划最终耽搁下来.现在正式开始,希望没有太迟. (PS:本人为菜鸟,写博纯粹为了自己更好学习编程:以