正则表达式定义

在js中有两种方式来定义正则表达式,

第一种是类似perl的语法来定义一个正则表达式,我们把它叫做正则表达式字面量法:

	var expression = /pattern/flag

其中pattern就是一个正则表达式,由字符类、限定符、分组、向前查找和反向引用组成。flag是匹配模式的标志,有gim三种:g代表全局模式,i代表不区分大小写,m表示多行模式。

第二种就是用RegExp构造函数创建,把它称作构造函数法。

如果第一种方法是这样表达:

	var pattern = /[bc]at/i;

换做构造函数法就如下:

	var pattern = new RegExp("[bc]at", "i");

两种方式是等价的,但是用构造函数法的时候元字符都要使用双重转义,比较麻烦,因此还是推荐使用字面量法,也不会混乱。

两种方法虽然是等价但是还有区别的,使用字面量法定义的正则表达式始终会共享同一个RegExp实例,而构造函数法的正则表达式每次都会创建一个新的实例,因此在循环调用正则表达式的方法时候两者会有不同的结果的,注意下就可以了。

字符类

也就是指书写pattern时候的各种形式的字符,除了'abc'这样的简单字符类主要有:

字母字符类

[...]

[^...]

.

\w

\W

\d

\D

\s

\S

[\b]

非字母字符类

\0

\t

\n

\r

\v

\f

\xnn

\uxxxx

\cX

转义字符类

也就是元字符,需要加上"\"进行转义

()

{}

[]

\

^

$

|

?

描述类

重复

{m,n}

{m,}

{m}

?

x? —在描述符后跟一个?表示非贪婪匹配,因为默认的都是贪婪匹配。

选择

|

分组和引用

(x) — 匹配 'x' 并且记住匹配项以便引用,引用用\n。

(?:x) — 匹配 'x' 但是不记住匹配项

锚类

^

$

\b

\B

(?=p) —正序断言

(?!p) —否定断言

RegExp实例方法

exec()

此方法可以说是为了捕获组而设置,接受一个字符串参数,返回包含第一个匹配项信息的数组,注意这里仅仅是第一个匹配项,即使加上g标志也是返回一个匹配项,不过加上g后连续调用exec()是在字符串中继续往下进行查找新匹配,但仍然是一个匹配项。

此方法返回的数组除了包含第一个匹配项外,其他则是与捕获组匹配的字符串。这个数组也有两个额外的属性index和input,index表示匹配项在字符串中的位置,而input则表示应用正则表达式的字符串。

test()

此方法接受一个字符串参数,如果模式与字符串匹配返回true,不匹配则返回false。通常用来做判断。

字符串的模式匹配方法

相对于RegExp实例方法来说这个反过来了,执行的是字符串的方法,参数是正则表达式。

search

查找匹配的字符串,返回第一个子串的起始位置,不支持全局匹配。

match

返回由匹配结果组成的数组,默认非全局匹配的话返回第一个匹配的字符串,如果全局匹配则返回所有匹配字符串。当使用括号分组的时候第一个元素为匹配的字符串,其后为圆括号中各个匹配的子字符串。

match方法与RegExp的exec方法很相似的,只是exec方法在全局匹配模式下还是返回第一个匹配字符串。

replace

一个在字符串中执行查找匹配的方法,并且使用替换字符串替换掉匹配到的子字符串。可以用$n来匹配正则表达式中圆括号中子表达式的捕获组文本。

与分组与引用里的括号一个意思:

那里是在正则表达式中用\n来引用捕获组匹配项。

split

字符串分割为数组。

几个有趣的正则表达式

1.把一串连续的数字变为三位分割表达的形式,比如12345变为12,345

答案:

"12345".replace(/(\d)(?=(?:\d{3})+(?!\d))/g, "$1,")

用到了正序断言,否定断言和非捕获分组三个重要的字符。

2.有美元1,100.0$和1,100.0¥这两种货币,用一句正则表达式把美元换成人民币,把人民币转换成美元。

答案:

	 '1,111.222¥'.replace(/(\d(?:,(?=\d\d\d)|\d)*(?:\.\d+)?)([$¥])/g,function(m,s1,s2){
if(s2=="$") {
return s1+"¥"
} else {
return s1+"$"
}
})

replace后跟函数时候,第一个参数为匹配的文本,后面参数依次为捕获组。

参考资料

权威指南正则

正则匹配和回溯

再读js正则表达式的更多相关文章

  1. 再议 js 数字格式之正则表达式

    原文:再议 js 数字格式之正则表达式 前面我们提到到了js的数字格式<浅谈 js 数字格式类型>,之前的<js 正则练习之语法高亮>里也提到了优化数字匹配的正则.不过最近落叶 ...

  2. JS正则表达式大全(整理详细且实用)

    JS正则表达式大全(整理详细且实用).需要的朋友可以过来参考下,希望对大家有所帮助!! 正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释, ...

  3. JS正则表达式完整教程

    JS正则表达式完整教程(略长) 引言 亲爱的读者朋友,如果你点开了这篇文章,说明你对正则很感兴趣. 想必你也了解正则的重要性,在我看来正则表达式是衡量程序员水平的一个侧面标准. 关于正则表达式的教程, ...

  4. 再探JS数组原生方法—没想到你是这样的数组

    最近作死又去做了一遍javascript-puzzlers上的44道变态题,这些题号称"JS语言专业八级"的水准,建议可以去试试,这里我不去解析这44道题了, ...

  5. JS正则表达式大全

    转自:http://wenku.baidu.com/link?url=3y930kC7F6D3wQdMjQ3fVDmiA9Wfebs_QK0UB3N3mFaEoKg4ytZORPopxufeYA6si ...

  6. 【正则】精通JS正则表达式,没消化 信息量太大,好文

    http://www.jb51.net/article/25313.htm 正则表达式可以: •测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用 ...

  7. (转)精通 JS正则表达式

    精通 JS正则表达式 (精通?标题党 ) 正则表达式可以: •测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证  ...

  8. JS正则表达式---分组

    JS正则表达式---分组 之前写了一篇关于正则新手入门的文章,本以为对正则表达式相对比较了解 但是今天我又遇到了一个坑,可能是自己不够细心的原因吧,今天就着重和大家分享一下javascript正则表达 ...

  9. js正则表达式匹配字符串与优化过程

    前言 有时候需要实现对js源文件中的url字符串做拦截预处理,或者前端js语法高亮,或者需要对动态加载的关键源码做混淆保护,在某些步骤实现之前,有一个步骤是需要提炼出所有的合法字符串. 目标:检测源文 ...

随机推荐

  1. Word文档粘贴到DEDECMS

    Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...

  2. 特权第一讲--Lesson 1 课程概述与如何学好FPGA

    FPGA的学习没有什么捷径,需要学习者多花时间和精力 . 1.设计输入 2.如何--对综合布局布线结果进行优化 3.如何--更有效地进行验证 4.如何--达到时序收敛 学习者需要用心去学习.去分析.去 ...

  3. 【CF1243A】Maximum Square【贪心】

    题意:给你n个长度为ai的木板,求最大能拼成的矩形为多大 题解:显然贪心每次选最大的进去拼,那么剧需要枚举矩形长度x,看最长的k个能够拼出长度为x的矩形即可 #include<iostream& ...

  4. Arithmetic Sequence

    Arithmetic Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  5. java 将MySql数据库中的数据(某一列)取出放入数组中 转

    转:http://blog.csdn.net/ewili/article/details/8605638 假设mysql中test数据库中有个表式score,有数据,我只取第一列的数据出来: publ ...

  6. Spring中@Async-异步处理

    在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后, ...

  7. (转)pycharm autopep8配置

    转:https://blog.csdn.net/BobYuan888/article/details/81943808 1.pip下载安装: 在命令行下输入以下命令安装autopep8 pip ins ...

  8. python中的变量的学习

    今年以来,时间都安排在学习python语言上了.(python3) 从最基础的变量开始学习.尽管以前学习过一段时间,但这次是系统性的学习,所以多花点时间,重新开始.学习完基础知识后,多练习几个项目. ...

  9. MySql 5.7.20 绿色版安装

    MySql 5.7.20 绿色版安装 一.MySql 安装 1.从官网下载绿色压缩包. 2.解压安装文件到指定目录 3.创建配置文件 my.ini 到解压文件的根目录,my.ini 配置文件如下,需将 ...

  10. 20150803--JS学习笔记(1)

    JS中对象的 prototype 的含义: javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用. A.pro ...