定义一个正則表達式

能够用字面量

var regex = /xyz/;
var regex = /xyz/i;

也能够用构造函数

var regex = new RegExp('xyz');
var regex = new RegExp('xyz', "i"); // 第二个參数表示修饰符

正則表達式组成

直接量字符

直接量字符如\a

特殊含义的字符须要转义

假设使用RegExp方法生成正则对象,转义须要使用两个斜杠。由于字符串内部会先转义一次。

(new RegExp("1\+1")).test("1+1") // false
(new RegExp("1\\+1")).test("1+1") // true

字符类

字符 匹配
[…] 方括号内的随意字符
[^…] 不在方括号内的随意字符
- 连字符
. 除了换行符和行结束符
\w 不论什么ASCII字符组成的单词=[a-zA-Z0-9]
\W =[^a-zA-Z0-9]
\s 空白字符
\S 非空白字符
\d ASCII数字=[0-9]
\D [^0-9]

连字符-[1-31]表示1至3。而不是到31

字符类的连字符必须在头尾两个字符中间,才有特殊含义。否则就是字面含义。比方。[-9]就表示匹配连字符和9,而不是匹配0到9。

反复

字符 描写叙述
{n,m}
{n,}
{n}
? 0次或1次
+ 在于等于1次
* 在于等于0次

非贪婪反复

在上面的反复字符后加上?就是非贪婪反复。

/a+/匹配字符串aaa时,会匹配aaa。而/a+?/会匹配a

正則表達式的模式匹配总是会寻找字符串中第一个可能匹配的位置。如/a+b/匹配aaab时,会匹配aaab/a+?

b/也会匹配’aaab’,都是从aaab中的第一个a開始匹配。所以,非贪婪模式并不表示最短匹配。

选择、分组和引用

选择

|

匹配abcdef

/ab|cd|ef/

分组

()

var m = "abcabc".match(/(.)b(.)/);
m; // ["abc", "a", "c"]

非捕获组

(?:x)称为非捕获组(Non-capturing group)。表示不返回该组匹配的内容。即匹配的结果中不计入这个括号。

var m = "abc".match(/(?

:.)b(.)/);
m[1]; // "c"

引用

\n

从1開始

不能在字符类中使用引用

指定匹配位置

字符 描写叙述
^
$
\b 匹配单词边界
\B 匹配非单词边界
(?=p) x(?=y)称为先行断言(Positive look-ahead),x仅仅有在y前面才匹配。y不会被计入返回结果。
(?

!p)

x(?!y)称为后行断言(Negative look-ahead),x仅仅有不在y前面才匹配。y不会被计入返回结果。

[\b]匹配的是退格

关于(?=p)(?!p)

var m = "abc".match(/b(?

=c)/);
m; // "b" var m = "abd".match(/b(? !c)/);
m; // ["b"]

修饰符

字符 描写叙述
i 不区分大写和小写
g 默认情况下,第一次匹配成功后。正则对象就停止向下匹配了。g修饰符表示全局匹配(global),加上它以后,正则对象将匹配全部符合条件的结果,主要用于搜索和替换。
m 字符串的头部或尾部可能会有换行符。

默认情况下,正则对象会将换行符算入字符串的开头或结尾。

m修饰符表示多行模式(multiline),加上它以后。正则对象会忽略字符串头部或尾部的换行符,即^和$会忽略换行符。

关于m

/world$/.test("hello world\n") // false
/world$/m.test("hello world\n") // true

上面的代码中。字符串结尾处有一个换行符。假设不加m修饰符,匹配不成功,由于字符串的结尾不是world;加上以后,换行符被省略,匹配成功。


属性和方法

ignoreCase:返回一个布尔值,表示是否设置了i修饰符,该属性仅仅读。

global:返回一个布尔值。表示是否设置了g修饰符,该属性仅仅读。

multiline:返回一个布尔值。表示是否设置了m修饰符,该属性仅仅读。

var r = /abc/igm;

r.ignoreCase // true
r.global // true
r.multiline // true

lastIndex:返回下一次開始搜索的位置。该属性可读写。可是仅仅在设置了g修饰符时有意义。

source:返回正則表達式的字符串形式(不包括反斜杠),该属性仅仅读。

var r = /abc/igm;

r.lastIndex // 0
r.source // "abc"

test()

正则对象的test方法返回一个布尔值。表示当前模式能否匹配參数字符串。

/cat/.test('cats and dogs') // true

假设正則表達式带有g修饰符,则每一次test方法都从上一次结束的位置開始向后匹配。

r.lastIndex // 0
r.test(s) // true r.lastIndex // 2
r.test(s) // true r.lastIndex // 4
r.test(s) // false

带有g修饰符时,能够通过正则对象的lastIndex属性指定開始搜索的位置

var r = /x/g;
var s = '_x_x'; r.lastIndex = 4;
r.test(s) // false

exec()

正则对象的exec方法,能够返回匹配结果。假设发现匹配。就返回一个数组,每一个匹配成功的子字符串,就是数组成员,否则返回null。

var s = '_x_x';
var r1 = /x/;
var r2 = /y/; r1.exec(s) // ["x"]
r2.exec(s) // null

假设正则表示式包括圆括号(即要求“组匹配”),则返回的数组会包括多个元素。

当中,第一个元素是整个匹配成功的结果,后面的元素就是圆括号相应的匹配成功的组。

也就是说。第二个元素相应第一个括号,第三个元素相应第二个括号,以此类推。

exec方法的返回数组还包括下面两个属性:

input:整个原字符串。

index:整个模式匹配成功的開始位置(从0開始)。

var r = /a(b+)a/;
var arr = regex.exec("_abbba_aba_"); arr // ["abbba", "bbb"] arr.index // 1
arr.input // "_abbba_aba_"

假设正則表達式加上g修饰符,则能够使用多次exec方法,下一次搜索的位置从上一次匹配成功结束的位置開始。

var r = /a(b+)a/g;

var a1 = r.exec("_abbba_aba_");
a1 // ["abbba", "bbb"]
a1.index // 1
r.lastIndex // 6 var a2 = r.exec("_abbba_aba_");
a2 // ["aba", "b"]
a2.index // 7
r.lastIndex // 10 var a3 = r.exec("_abbba_aba_");
a3 // null
a3.index // TypeError: Cannot read property 'index' of null
r.lastIndex // 0 var a4 = r.exec("_abbba_aba_");
a4 // ["abbba", "bbb"]
a4.index // 1
r.lastIndex // 6

字符串中与正則表達式相关的4个函数

match

match方法与正则对象的exec方法很相似:匹配成功返回一个数组,匹配失败返回null。

假设正則表達式带有g修饰符,则该方法与正则对象的exec方法行为不同。会一次性返回全部匹配成功的结果。

var s = "abba";
var r = /a/g; s.match(r) // ["a", "a"]
r.exec(s) // ["a"]

设置正則表達式的lastIndex属性,对match方法无效。匹配总是从字符串的第一个字符開始。

search

字符串对象的search方法。返回第一个满足条件的匹配结果在整个字符串中的位置。假设没有不论什么匹配,则返回-1。

该方法会忽略g修饰符。

设置正則表達式的lastIndex属性,对match方法无效,匹配总是从字符串的第一个字符開始。

replace

它接受两个參数,第一个是搜索模式,第二个是替换的内容。

搜索模式假设不加g修饰符。就替换第一个匹配成功的值。否则替换全部匹配成功的值。

replace方法的第二个參数能够使用美元符号$,用来指代所替换的内容。

$ & 指代匹配的子字符串。

$` 指代匹配结果前面的文本。

$’ 指代匹配结果后面的文本。

$n 指代匹配成功的第n组内容。n是从1的自然数。

"hello world".replace(/(\w+)\s(\w+)/,"$2 $1")
// "world hello" "abc".replace("b", "[$`-$&-$']")
// "a[a-b-c]c"

replace方法的第二个參数还能够是一个函数,将匹配内容替换为函数返回值。

作为replace方法第二个參数的替换函数,能够接受多个參数。它的第一个參数是捕捉到的内容,第二个參数是捕捉到的组匹配(有多少个组匹配,就有多少个相应的參数)。

此外。最后还能够加入两个參数,倒数第二个參数是捕捉到的内容在整个字符串中的位置(比方从第五个位置開始)。最后一个參数是原字符串。

split

字符串对象的split方法依照正则规则切割字符串,返回一个由切割后的各个部分组成的数组。

该方法接受两个參数。第一个參数是分隔规则。第二个參数是返回数组的最大成员数。

'a,  b,c, d'.split(',')
// [ 'a', ' b', 'c', ' d' ] 'a, b,c, d'.split(/, */)
// [ 'a', 'b', 'c', 'd' ] 'a, b,c, d'.split(/, */, 2)
[ 'a', 'b' ]

空格能够直接用/, */


javascript正則表達式的更多相关文章

  1. javascript 正則表達式补充

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

  2. JavaScript正則表達式知识汇总

    Js 正則表達式知识汇总 正則表達式: 1.什么是RegExp?RegExp是正則表達式的缩写.RegExp 对象用于规定在文本中检索的内容. 2.定义RegExp:var +变量名=new RegE ...

  3. javascript正則表達式 &quot;\b&quot;问题

    preface 昨晚在看<javascript权威指南>后.看见作者自己封装一个兼容全部浏览器的山寨HTML5新API classLIst类.自己想了想认为自己也要去玩一下.可是能力还是有 ...

  4. DOM笔记(十):JavaScript正則表達式

    一.RegExp ECMAScript通过RegExp类型类支持正則表達式,语法和Perl类似: var exp = /pattern/flags; patternb部分是不论什么简单的或复杂的正則表 ...

  5. JavaScript 正則表達式

    一.简单介绍 1.什么是正則表達式 正則表達式本身就是一种语言,这在其他语言是通用的. 正則表達式(regular expression)描写叙述了一种字符串匹配的模式,能够用来检查一个串是否含有某种 ...

  6. 经常使用的正則表達式归纳—JavaScript正則表達式

    来源:http://www.ido321.com/856.html 1.正则优先级 首先看一下正則表達式的优先级,下表从最高优先级到最低优先级列出各种正則表達式操作符的优先权顺序: 2.经常使用的正則 ...

  7. javascript——正則表達式

    正則表達式(RegExp对象):主要用于表单验证 1.创建正則表達式: (1).var ret = /pattern/; pattern是内容.能够是正則表達式的内容,能够是字符或是其它的内容 (2) ...

  8. JavaScript使用正則表達式

    2.0 简单介绍 正則表達式是能够用来查找与给定模式匹配的文本的搜索模式.比如,在上一章中,我们在一个较长的字符串中查找子字符串Cookbook: var testValue = "This ...

  9. js正則表達式语法

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

随机推荐

  1. [LeetCode]152. Maximum Product Subarray

    This a task that asks u to compute the maximum product from a continue subarray. However, you need t ...

  2. Unity3d dotween

    位置 1. 移动到指定位置 obj.transform.DOMove(, , ), 2f); a. 单方向可以用DOMoveX.DOMoveY.DOMoveZ b. 本地坐标系版本:DOLocalMo ...

  3. C++ Primer(第4版)-学习笔记-第2部分:容器和算法

    第9章 顺序容器 顺序容器和关联容器 顺序容器内的元素按其位置存储和访问. 关联容器,其元素按键(key)排序. 顺序容器(sequential container). 顺序容器的元素排列次序与元素值 ...

  4. android黑科技系列——获取加固后应用App的所有方法信息

    一.前言 在逆向应用的时候,我们有时候希望能够快速定位到应用的关键方法,在之前我已经详细介绍了一个自己研发的代码动态注入工具icodetools,来进行动态注入日志信息到应用中,不了解的同学可以查看这 ...

  5. 巧用Eclipse Java编辑器调试

    在使用Eclipse开发Java Web应用时,使用的编辑器不但能够为开发者提供代码编写.辅助提示和实时编译等常用功能,而且还能够对Java源代码进行快捷修改.重构和语法纠错等高级操作.通过Eclip ...

  6. 一,前端---关于微信小程序遇到的wx.request({})问题

    域名请求错误问题 当我们在编写小程序,要发送请求时,wx.request({})时或许会遇到如下的问题: 一:这是因为微信小程序的开发中,域名只能是https方式请求,所以我们必须在小程序微信公众平台 ...

  7. mysql自动增长的有关问题,怎么恢复从1开始

    mysql自动增长的问题,如何恢复从1开始在一个表中我设置到autoid为自动增长列例如有如下数据 1 张三 男 202 王五 男 223 李四 男 254 陈大 男 19 现在我把 autoid=3 ...

  8. java实例1

    1.满天星星 import java.awt.*; public class xinxin { public static void main(String[] args) { Frame w = n ...

  9. rrdtool 实践

    rrdtool 实践 rrdtool 参数比较多,如果直接看文档,不知从何入手,直接从例子入手这样容易理解,模拟网卡流量 1. 创建数据库 rrdtool create Flow.rrd --star ...

  10. Discuz 首页图文列表实现

    <div id="shoucang"> <!--{eval $list_count=0;}--> <!--{loop $threadlist $thr ...