正则表达式就是一个用来描述字符模式的对象。它被用来在文本中执行模式匹配(pattern-matching)以及”查找-替换”(search-and-replace)的任务。javascript中正则的风格类似Perl中正则的风格。

创建

var reg = new RegExp(pattern,modifiers);

var reg = /pattern/modifiers;

modifiers包括

  • g : 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)

    'Hey, Is this all there Is '.replace(/Is/g, 'is');//替换某字符串中所有的Is为is
  • i : 执行对大小写不敏感的匹配
  • m : 执行多行匹配,具体见这里
    ps 新建一正则时可多个模式,如 /hEllO/ig

正则相关方法

  • .test()。该方法对一个字符串进行匹配。并根据匹配结果返回true或false。例如

    /e/.test('The best things in life are free'); //true
  • .exec()。该方法将对一个字符串进行匹配。并返回第一个匹配项目。例如:
    /e/.exec('The best things in life are free'); // ["e"]

在字符串方法中,有match方法,与exec类似。如

'The best things in life are free'.match(/e/); //["e"]

正则中的元字符

正则表达式中的元字符是用来替代一类具有相同属性的字符的特殊字符,它也可以被称为字符类(character class)。

  • . 查找单个字符,除了换行和行结束符。
  • \w 查找单词字符(字母、数字以及下划线”_”)。
  • \W 查找非单词字符。
  • \d 查找数字。
  • \D 查找非数字字符。
  • \s 查找空白字符。
  • \S 查找非空白字符。
  • \b 匹配单词边界。
  • \B 匹配非单词边界。
  • \0 查找 NUL 字符。
  • \n 查找换行符。
  • \f 查找换页符。
  • \r 查找回车符。
  • \t 查找制表符。
  • \v 查找垂直制表符。
  • \xxx 查找以八进制数 xxx 规定的字符。
  • \xdd 查找以十六进制数 dd 规定的字符。
  • \uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。

正则表达式中的括号

大括号 ()

进行分组。好比email地址,我们就可以将它分为

  1. @前面的部分;
  2. @后面’.’之前的部分;
  3. ’.’之后的部分;
    如果要匹配所有gamil邮箱中@前的用户名中带有jack的替换为joel
    'iamjack007@gmail.com'.replace(/^(\w*)(jack)(\w*)@gmail\.com$/, '$1joel$3@gmail.com');  //"iamjoel007@gmail.com"

    这种类似于模块化的思想,不仅使我们一次可以专注于查找其中的一个小部分,也可以让我们在后面可以轻松的替换其中的某个部分,而不需要纠结于“牵一发而动全身”的痛苦。

方括号 []

用于查找某个范围内的字符

  • [abc] 查找方括号之间的任何字符。
  • [^abc] 查找任何不在方括号之间的字符。
  • [0-9] 查找任何从 0 至 9 的数字。
  • [a-z] 查找任何从小写 a 到小写 z 的字符。
  • [A-Z] 查找任何从大写 A 到大写 Z 的字符。
  • [A-z] 查找任何从大写 A 到小写 z 的字符。
  • [adgk] 查找方括号内的任何字符。
  • [^adgk] 查找不在方括号内的任何字符。

量词

匹配多个。如匹配3个数字可用正则/\d{3}/

  • n+ 匹配任何包含至少一个 n 的字符串。
  • n* 匹配任何包含零个或多个 n 的字符串。
  • n? 匹配任何包含零个或一个 n 的字符串。
  • n{X} 匹配包含 X 个 n 的序列的字符串。
  • n{X,Y} 匹配包含 X 或 Y 个 n 的序列的字符串。
  • n{X,} 匹配包含至少 X 个 n 的序列的字符串。
  • n$ 匹配任何结尾为 n 的字符串。
  • ^n 匹配任何开头为 n 的字符串。
  • ?=n 匹配任何其后紧接指定字符串 n 的字符串。
  • ?!n 匹配任何其后没有紧接指定字符串 n 的字符串。

习题

  1. 在字符串”1.5 0 123 -7 -0.4”里面匹配带小数点的数,无论是正的还是负的。
  2. 在字符串”1.5 0 123”中匹配数字([1.5,0,123]),无论是整数还是小数。
  3. 更多习题

进阶

贪婪和非贪婪模式

默认正则匹配是贪婪模式的,即前面的正则匹配尽可能多的。如

/(\d+)(\d+)/.exec('12345');//结果["12345", "1234", "5"]

开启非贪婪模式,量词后面加?

/(\d+?)(\d+)/.exec('12345');//结果["12345", "1", "2345"]

更详细的的解释,点这里

非捕获性分组

在括号内容以?:开头。如:

/(?:\d+)\d+/.exec('123');// 结果 ["123"]

匹配

Lookaround 是 向前匹配(Lookahead) 和 向后匹配(Lookbehind) 的统称。
向前匹配

包括向前正向匹配(Positive Lookahead)和向前负向匹配(Negative Lookahead),语法是 ?= 和 ?!
前正向匹配:匹配任何其后紧接指定字符串 n 的字符串。
向前负向匹配:匹配任何其后没有紧接指定字符串 n 的字符串。

类似的还有向后匹配。
在javascript目前只能使用 Lookahead,还无法使用 Lookbehind。

Lookaround 参考教程:http://www.regular-expressions.info/lookaround.html

正则拓展库

xregexp特性

  1. 支持所有的ES5的正则的语法。
  2. 兼容 Explorer 5.5+, Firefox 1.5+, Chrome, Safari 3+, and Opera 11+。在nodejs上也可以使用。
  3. 比原生正则可读性高。
  4. 比原生正则易用。

更多资源

参考

习题答案

  1. '1.5 0 123 -7 -0.4'.match(/(-?\d+.\d+)/g)
  2. '1.5 0 123'.match(/(\d+.?\d+)|0/g)

javascript正则表达式介绍的更多相关文章

  1. JavaScript正则表达式详解(一)正则表达式入门

    JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...

  2. JavaScript正则表达式下——相关方法

    上篇博客JavaScript 正则表达式上——基本语法介绍了JavaScript正则表达式的语法,有了这些基本知识,可以看看正则表达式在JavaScript的应用了,在一切开始之前,看看RegExp实 ...

  3. JavaScript 正则表达式上——基本语法

    定义 JavaScript种正则表达式有两种定义方式,定义一个匹配类似 <%XXX%> 的字符串 1. 构造函数 var reg=new RegExp('<%[^%>]+%&g ...

  4. 5分钟教你学会JavaScript正则表达式

    正则表达式在实际开发过程中和技术面试过程中的重要性不言而喻,本文仅仅只是教你如何在几分钟之类学会正则表达式,对于它的原理及运行机制不做介绍. 第一:什么是正则 正则表达式是一种用来描述一定数量文本的模 ...

  5. JavaScript正则表达式学习笔记(二) - 打怪升级

    本文接上篇,基础部分相对薄弱的同学请移步<JavaScript正则表达式学习笔记(一) - 理论基础>.上文介绍了8种JavaScript正则表达式的属性,本文还会追加介绍几种JavaSc ...

  6. javascript 正则表达式补充

    定义 JavaScript种正则表达式有两种定义方式,定义一个匹配类似 <%XXX%> 的字符串 1. 构造函数 var reg=new RegExp('<%[^%>]+%&g ...

  7. JavaScript 正则表达式基础语法

    前言 正则表达式在人们的印象中可能是一堆无法理解的字符,但就是这些符号却实现了字符串的高效操作.通常的情况是,问题本身并不复杂,但没有正则表达式就成了大问题.javascript中的正则表达式作为相当 ...

  8. javascript正则表达式语法

    1. 正则表达式规则 1.1 普通字符 字母.数字.汉字.下划线.以及后边章节中没有特殊定义的标点符号,都是"普通字符".表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的 ...

  9. 玩转JavaScript正则表达式

    Why Regular Expression 我们先来看看,我们干哈要学正则表达式这玩意儿: 复杂的字符串搜寻.替换工作,无法用简单的方式(类似借助标准库函数)达成. 能够帮助你进行各种字符串验证. ...

随机推荐

  1. 通过两根RS232连接两台电脑

    把RS232的有5脚那边放下面,最左边是GND,第二三是TXD和RXD,两个RS232反接,然后两个usb连接电脑就可以通信了

  2. 安卓开发之json解析

    1.从网页获取json返回字符串 public class ReadNet extends AsyncTask<URL, Integer, String> { @Override      ...

  3. 初试 uTenux

    申请的的开发套件到目前还没到手,看到网友们都开始动手干了,我也是按捺不住了,所以就先在悠龙公司的主页下载了uTenux_V1.5.00r160.zip,打算看看,先了解一下. 下面是文件目录表: └─ ...

  4. SQL分组查询每组前几条数据

    /*第一种实现方法,效率低并且有错误*/ DECLARE @DD DATETIME SET @DD = GETDATE() SELECT a.GoodsID , a.Account , a.LastU ...

  5. sequenza细胞纯度计算

    安装sequenza bam文件要放在前面,否侧会-f命令可能识别错误 samtools mpileup a.bam -f hg19.fasta -Q 20 |gzip > normal.pil ...

  6. CUBRID学习笔记 41 sql语法之select

    cubrid的中sql查询语法 SELECT [ ] [{TO | INTO} ][FROM ] [WHERE ][GROUP BY {col_name | expr} [ASC | DESC], . ...

  7. hdu 1700 Points on Cycle(坐标旋转)

    http://acm.hdu.edu.cn/showproblem.php?pid=1700 Points on Cycle Time Limit: 1000/1000 MS (Java/Others ...

  8. 3.mybatis注解

    在上篇2.mybatis入门实例(一) 连接数据库进行查询的基础上 1.添加Mapper接口:UserMapper接口,并使用mybatis的注解 import java.util.List; imp ...

  9. python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)

    python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...

  10. iOS - OC SQLite 数据库存储

    前言 采用 SQLite 数据库来存储数据.SQLite 作为一中小型数据库,应用 iOS 中,跟前三种保存方式相比,相对比较复杂一些. 注意:写入数据库,字符串可以采用 char 方式,而从数据库中 ...