正则表达式就是一个用来描述字符模式的对象。它被用来在文本中执行模式匹配(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. Linux 性能监测:介绍

    看了某某教程.读了某某手册,按照要求改改某某设置.系统设定.内核参数就认为做到系统优化的想法很傻很天真:)系统优化是一项复杂.繁琐.长期的 工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采 ...

  2. 【leetcode❤python】 290. Word Pattern

    #-*- coding: UTF-8 -*-class Solution(object):    def wordPattern(self, pattern, str):        "& ...

  3. Java-集合框架整理

    一.List 接口集合: 1.优势以及特点:有序,允许重复元素 . 2.实现类: * AarrayList 类:不同步,可变长度数组,倍增率为 1/n ; * LinkedList 类:不同步,链表结 ...

  4. 【转载】C++内存分配

    原文:C++内存分配 内存泄露相信对C++程序员来说都不陌生.解决内存泄露的方案多种多样,大部分方案以追踪检测为主,这种方法实现起来容易,使用方便,也比较安全. 首先我们要确定这个模块的主要功能: 能 ...

  5. 历史命令history

    历史命令在用户注销之后会保存在用户家目录下的-/.bash_history中 history #查看系统中实时缓存的历史命令,与.bash_history中的内容并不完全相同 history -c # ...

  6. 多线程处理sql server2008出现Transaction (Process ID) was deadlocked on lock resources with another process and has been chose问题

    多线程处理sql server2008某个表中的数据时,在Update记录的时候出现了[Transaction (Process ID 146) was deadlocked on lock reso ...

  7. GitHub上不错的Android开源项目(二)

    收集相关系列资料,自己用作参考,练习和实践.小伙伴们,总有一天,你也能写出 Niubility 的 Android App :-) 系列文章如下: GitHub上不错的Android开源项目(一):h ...

  8. git原理图解

    本文背景,在实际项目中使用git已有一年,发现不少同事虽然会使用常用git指令,但并不理解每个指令对应的作用原理.今天静下心总结下git 的基本理解:代码的存在区域:本文以实际项目出发,理清使用git ...

  9. Spring XML配置实现AOP

    1:  首先我们要定义 配置成切面的类 package cn.gbx.example; import org.aspectj.lang.ProceedingJoinPoint; import org. ...

  10. mybatis的xml文件中如何处理大小于号

    在mybatis的xml配置文件中会遇到大小于号转化的问题,解决问题的方法如下: 1.用转义字符把>和<替换掉 SELECT * FROM test WHERE AND start_dat ...