RegExp对象—匹配规则

1.字面量字符和元字符

image.png

1.1字面量字符

大部分字符在正则表达式中,就叫做“字面量字符”

/dog/匹配“old dog”,因为它就表示“d”、“o”、“g”三个字母连在一起。

2元字符 .、^、$、|、\、*、+、?、()、[]、{}

还有一部分字符有特殊含义,不代表字面的意思

2.1点字符 .

  • 匹配除回车、换行 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。
    /c.t/
  • 匹配c和t之间包含任意一个字符的情况,只要这三个字符在同一行
  • 匹配cat、c2t、c-t等等,但是不匹配coot

2.2选择符 |

表示“或关系”(OR),
cat|dog表示匹配cat或dog。
多个选择符可以联合使用。

/a( |\t)b/.test('a\tb') // true
上面代码指的是,a和b之间有一个空格或者一个制表符

2.2字符类 []

表示字符类里的字符,只要匹配其中一个就可以

[xyz] 表示x、y、z之中任选一个匹配

2.2.1脱字符 ^

表示紧跟脱字符的字面量字符,其他字符都可以匹配。
[^xyz]表示除了x、y、z之外都可以匹配。
字符类只有脱字符[^]
表示匹配一切字符,其中包括换行符,而点号(.)是不包括换行符的

2.2.2连字符 -

表示有连续序列的字符的连续范围
字符类的连字符必须在头尾两个字符中间,才有特殊含义,否则就是字面含义

[0123456789]可以写成[0-9]
[0-9.,]
[0-9a-fA-F]
[a-zA-Z0-9-]
[1-31]

最后一个字符类[1-31],不代表1到31,只代表1到3。
在ASCII编码之中,大写字母与小写字母之间还有其他字符,结果就会出现意料之外的结果。反斜杠(\)的ASCII码在大写字母与小写字母之间

2.2.3 预定义模式

QQ图片20170530151647.png
  • \d
    匹配0-9之间的任一数字,相当于[0-9]。
  • \D
    匹配所有0-9以外的字符,相当于[^0-9]。
  • \w
    匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_]。
  • \W
    除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_]。
  • \s
    匹配空格(包括制表符、空格符、断行符等),相等于[\t\r\n\v\f]。
  • \S
    匹配非空格的字符,相当于[^\t\r\n\v\f]。
  • \b
    匹配词的边界。
  • \B
    匹配非词边界,即在词的内部。

2.3位置字符 ^、$

用来提示字符所处的位置

  • ^
    表示后面跟着的字符串必须出现在开始位置
  • $
    表示前面紧靠的字符串必须出现在结束位置

2.4转义符 \特殊字符^、.、[、$、(、)、|、*、+、?、{、\

特殊含义的字符,要匹配它们本身,就需要在它们前面要加上反斜杠。

比如要匹配加号,就要写成+。

使用RegExp方法生成正则对象,
转义需要使用两个斜杠,因为字符串内部会先转义一次。

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

2.5特殊字符 \cX、[\b]、\n、\r、\t、\v、\f、\0、\xhh、\uhhhh

不能打印的特殊字符

  • \cX
    表示Ctrl-[X],其中的X是A-Z之中任一个英文字母,用来匹配控制字符
  • [\b]
    匹配退格键(U+0008),不要与\b混淆
  • \n
    匹配换行键
  • \r
    匹配回车键
  • \t
    匹配制表符tab(U+0009)
  • \v
    匹配垂直制表符(U+000B)
  • \f
    匹配换页符(U+000C)
  • \0
    匹配null字符(U+0000)
  • \xhh
    匹配一个以两位十六进制数(\x00-\xFF)表示的字符
  • \uhhhh
    匹配一个以四位十六进制数(\u0000-\uFFFF)表示的unicode字符

2.6重复类 {匹配次数} ? * +

模式的精确匹配次数

  • {n}
    表示恰好重复n次
  • {n,}
    表示至少重复n次
  • {n,m}
    表示重复不少于n次,不多于m次

2.6.1量词符 ? * +

量词符紧跟着字符后面
?
问号表示某个模式出现0次或1次,等同于{0, 1}。
*
星号表示某个模式出现0次或多次,等同于{0,}。
+
加号表示某个模式出现1次或多次,等同于{1,}。

2.6.2贪婪模式、非贪婪模式 *? *+

  • 贪婪模式
    三个量词符,默认情况下都是最大可能匹配,即匹配直到下一个字符不满足匹配规则为止
  • 非贪婪模式
    一旦条件满足,就不再往下匹配
    *?
    表示某个模式出现0次或多次,匹配时采用非贪婪模式
    +?
    表示某个模式出现1次或多次,匹配时采用非贪婪模式

2.7修饰符 g i m

表示模式的附加规则,放在正则模式的最尾部。
修饰符可以单个使用,也可以多个一起使用

2.7.1 g

  • 不含g修饰符(默认情况)
    第一次匹配成功后,正则对象就停止向下匹配了
    每次都是从字符串头部开始匹配

  • 含有g修饰符
    每次都是从上一次匹配成功处,开始向后匹配
    表示全局匹配,主要用于搜索和替换

2.7.2 i

  • 不含i修饰符(默认情况)
    区分字母的大小写,
  • 含i修饰符
    表示忽略大小写

2.7.3 m

  • 不含m修饰符(默认情况)
    ^和$匹配字符串的开始处和结尾处,
  • 含m修饰符
    m修饰符表示多行模式
    ^和$还会匹配行首和行尾
    即^和$会识别换行符(\n)

2.8组匹配 ( )

除了返回匹配的内容(包括该组匹配的内容)
还会单独返回括号内的内容即该组匹配的内容

2.8.1概述 嵌套 \1 \2

  • 不宜同时使用g修饰符,否则match方法不会捕获分组的内容

var m = 'abcabc'.match(/(.)b(.)\1\2/); m // ['abc', 'a', 'c',’a’,’c’,]
可以用\n引用括号匹配的内容,n是从1开始的自然数,表示对应顺序的括号

  • 括号还可以嵌套

var m = 'abcabc'.match(/(b(.))\1\2/); m // ['bc', 'c',’bc,’c’,]
\1指向外层括号,\2指向内层括号

2.8.2非捕获组 (?:x)

只返回匹配的内容(包括该组匹配的内容)
不返回该组匹配的内容

var m = 'abc'.match(/(?:.)b(.)/); m // ["abc", "c"]

2.8.3先行断言 x(?=y)

x只有在y前面才匹配,y不会被计入返回结果,因为括号里的部分是不会返回的

var m = 'abc'.match(/b(?=c)/); m // ["b"]

2.8.4先行否定断言 x(?!y)

x只有不在y前面才匹配,y不会被计入返回结果,括号里的部分是不会返回的

/\d+(?!.)/.exec('3.14') // ["14"]](http://upload-images.jianshu.io/upload_images/5467482-2a101038cc487c26.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

1.字面量字符和元字符

1.1字面量字符

大部分字符在正则表达式中,就叫做“字面量字符”

/dog/匹配“old dog”,因为它就表示“d”、“o”、“g”三个字母连在一起。

2元字符 .、^、$、|、\、*、+、?、()、[]、{}

还有一部分字符有特殊含义,不代表字面的意思

2.1点字符 .

  • 匹配除回车、换行 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。
    /c.t/
  • 匹配c和t之间包含任意一个字符的情况,只要这三个字符在同一行
  • 匹配cat、c2t、c-t等等,但是不匹配coot

2.2选择符 |

表示“或关系”(OR),
cat|dog表示匹配cat或dog。
多个选择符可以联合使用。

/a( |\t)b/.test('a\tb') // true
上面代码指的是,a和b之间有一个空格或者一个制表符

2.2字符类 []

表示字符类里的字符,只要匹配其中一个就可以

[xyz] 表示x、y、z之中任选一个匹配

2.2.1脱字符 ^

表示紧跟脱字符的字面量字符,其他字符都可以匹配。
[^xyz]表示除了x、y、z之外都可以匹配。
字符类只有脱字符[^]
表示匹配一切字符,其中包括换行符,而点号(.)是不包括换行符的

2.2.2连字符 -

表示有连续序列的字符的连续范围
字符类的连字符必须在头尾两个字符中间,才有特殊含义,否则就是字面含义

[0123456789]可以写成[0-9]
[0-9.,]
[0-9a-fA-F]
[a-zA-Z0-9-]
[1-31]

最后一个字符类[1-31],不代表1到31,只代表1到3。
在ASCII编码之中,大写字母与小写字母之间还有其他字符,结果就会出现意料之外的结果。反斜杠(\)的ASCII码在大写字母与小写字母之间

2.2.3 预定义模式

  • \d
    匹配0-9之间的任一数字,相当于[0-9]。
  • \D
    匹配所有0-9以外的字符,相当于[^0-9]。
  • \w
    匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_]。
  • \W
    除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_]。
  • \s
    匹配空格(包括制表符、空格符、断行符等),相等于[\t\r\n\v\f]。
  • \S
    匹配非空格的字符,相当于[^\t\r\n\v\f]。
  • \b
    匹配词的边界。
  • \B
    匹配非词边界,即在词的内部。

2.3位置字符 ^、$

用来提示字符所处的位置

  • ^
    表示后面跟着的字符串必须出现在开始位置
  • $
    表示前面紧靠的字符串必须出现在结束位置

2.4转义符 \特殊字符^、.、[、$、(、)、|、*、+、?、{、\

特殊含义的字符,要匹配它们本身,就需要在它们前面要加上反斜杠。

比如要匹配加号,就要写成+。

使用RegExp方法生成正则对象,
转义需要使用两个斜杠,因为字符串内部会先转义一次。

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

2.5特殊字符 \cX、[\b]、\n、\r、\t、\v、\f、\0、\xhh、\uhhhh

不能打印的特殊字符

  • \cX
    表示Ctrl-[X],其中的X是A-Z之中任一个英文字母,用来匹配控制字符
  • [\b]
    匹配退格键(U+0008),不要与\b混淆
  • \n
    匹配换行键
  • \r
    匹配回车键
  • \t
    匹配制表符tab(U+0009)
  • \v
    匹配垂直制表符(U+000B)
  • \f
    匹配换页符(U+000C)
  • \0
    匹配null字符(U+0000)
  • \xhh
    匹配一个以两位十六进制数(\x00-\xFF)表示的字符
  • \uhhhh
    匹配一个以四位十六进制数(\u0000-\uFFFF)表示的unicode字符

2.6重复类 {匹配次数} ? * +

模式的精确匹配次数

  • {n}
    表示恰好重复n次
  • {n,}
    表示至少重复n次
  • {n,m}
    表示重复不少于n次,不多于m次

2.6.1量词符 ? * +

量词符紧跟着字符后面
?
问号表示某个模式出现0次或1次,等同于{0, 1}。
*
星号表示某个模式出现0次或多次,等同于{0,}。
+
加号表示某个模式出现1次或多次,等同于{1,}。

2.6.2贪婪模式、非贪婪模式 *? *+

  • 贪婪模式
    三个量词符,默认情况下都是最大可能匹配,即匹配直到下一个字符不满足匹配规则为止
  • 非贪婪模式
    一旦条件满足,就不再往下匹配
    *?
    表示某个模式出现0次或多次,匹配时采用非贪婪模式
    +?
    表示某个模式出现1次或多次,匹配时采用非贪婪模式

2.7修饰符 g i m

表示模式的附加规则,放在正则模式的最尾部。
修饰符可以单个使用,也可以多个一起使用

2.7.1 g

  • 不含g修饰符(默认情况)
    第一次匹配成功后,正则对象就停止向下匹配了
    每次都是从字符串头部开始匹配

  • 含有g修饰符
    每次都是从上一次匹配成功处,开始向后匹配
    表示全局匹配,主要用于搜索和替换

2.7.2 i

  • 不含i修饰符(默认情况)
    区分字母的大小写,
  • 含i修饰符
    表示忽略大小写

2.7.3 m

  • 不含m修饰符(默认情况)
    ^和$匹配字符串的开始处和结尾处,
  • 含m修饰符
    m修饰符表示多行模式
    ^和$还会匹配行首和行尾
    即^和$会识别换行符(\n)

2.8组匹配 ( )

除了返回匹配的内容(包括该组匹配的内容)
还会单独返回括号内的内容即该组匹配的内容

2.8.1概述 嵌套 \1 \2

  • 不宜同时使用g修饰符,否则match方法不会捕获分组的内容

var m = 'abcabc'.match(/(.)b(.)\1\2/); m // ['abc', 'a', 'c',’a’,’c’,]
可以用\n引用括号匹配的内容,n是从1开始的自然数,表示对应顺序的括号

  • 括号还可以嵌套

var m = 'abcabc'.match(/(b(.))\1\2/); m // ['bc', 'c',’bc,’c’,]
\1指向外层括号,\2指向内层括号

2.8.2非捕获组 (?:x)

只返回匹配的内容(包括该组匹配的内容)
不返回该组匹配的内容

var m = 'abc'.match(/(?:.)b(.)/); m // ["abc", "c"]

2.8.3先行断言 x(?=y)

x只有在y前面才匹配,y不会被计入返回结果,因为括号里的部分是不会返回的

var m = 'abc'.match(/b(?=c)/); m // ["b"]

2.8.4先行否定断言 x(?!y)

x只有不在y前面才匹配,y不会被计入返回结果,括号里的部分是不会返回的

/\d+(?!.)/.exec('3.14') // ["14"]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,800评论 6 13
  • 一、概述 正则表达式(regular expression)是一种表达字符串结构的方法,有点像字符串的模版,常常用...
    周花花啊阅读 537评论 0 1
  • '^'必须才开头开始匹配'$'必须在末尾结束匹配'|' 表示‘或’/ab|cd/匹配ab或者cd'.'表示点字符(...
    zjh111阅读 410评论 0 0
  • 每每经过美丽的橱窗,停下脚步常幻想着未来这属于你吗?橱窗里漂亮的衣服、精美饰品、简约大方的生活用品以及每个女孩渴望...
    TrySmile365阅读 397评论 0 0