js-正则表达式

正则表达式

正则的教程很多,小编本着让大家通俗易懂的学习,以最简单的方式介绍正则表达式,不喜勿喷。


元字符(断言)

. 匹配除换行符以外的任意字符

\w 匹配字母或数字或下划线或汉字

\s 匹配一个空白字符,包括空格、制表符、换页符和换行符。

\d 匹配数字

\b 匹配单词的开始或结束

^ 匹配字符串的开始

$ 匹配字符串的结束

\n 匹配一个换行符

\r 匹配一个回车符

\0nn ASCII 代码中八进制代码为nn的字符

\xnn ASCII 代码中十六进制代码为nn的字符

\unnnn Unicode 代码中十六进制代码为 nnnn 的字符 [\u4e00-\u9fa5]

如果我们要查找元字符本身需要加上 \ 转义,如:\*\\w

重复

* 重复零次或更多次

+ 重复一次或更多次

? 重复零次或一次

{n} 重复 n 次

{n,} 重复 n 次或更多次

{n,m} 重复 n 到 m 次

字符类

[a-zA-Z]

[\w]

[0-9]

分枝条件

| 或 注意:abc|eba

分组

(\d{1,3}){3}

反义

\W 匹配任意不是字母,数字,下划线,汉字的字符

\S 匹配任意不是空白符的字符

\D 匹配任意非数字的字符

\B 匹配不是单词开头或结束的位置

[^x] 匹配除了 x 以外的任意字符

[^aeiou] 匹配除了 aeiou 这几个字母以外的任意字符

操练

0\d{2}-\d{8}

(?0\d{2})?[- ]?\d{8}|0\d{2}[- ]?\d{8}

((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

/(?\d{3})?([-\/.])\d{3}\1\d{4}/

反向引用

\n

命名分组

(?P<name>...)

例子:

<([^>]+)>[\s\S]*?</\1>

非捕获分组

(?:...)

例子:

(?:\d{4})-(\d{2})-(\d{2})

环视(零宽断言)

(?=...) 肯定顺序环视(向右)

(?!...) 否定顺序环视(向右)

(?<=..) 肯定逆序环视 (向左) Javascript 不支持

(?<!..) 否定逆序环视 (向左) Javascript 不支持

例子:

(<(?!/))(<[^/]) 区别

1(?=\d{3})

贪婪与懒惰

*? 尽可能少的匹配

(...)+?

其它

匹配模式

i 不区分大小写

g 全局查找, 不是找到第一个就停止

m 多行模式

优化级

()

*?+

abc

a|bc


Javascript 中的正则 API

正则对象

new RegExp(pattern [, flags]) 好处是可以使用字符串拼接

new RegExp("abc|" + foo)

/\d+/igm 字面量

注意:RegExp 这个对象保存了一些匹配对象的状态信息

source 表达式的文本形式

global 是否指定的全局模式

ignoreCase 是否标示不区分大小写模式

multiline 是否指定了多行模式

lastIndex 如果使用全局模式,变量保存的是在字符串中尝试下次匹配的偏移值

exec 方法用于检索字符串中的正则表达式的匹配。

返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

var pattern = /\d{4}-\d{2}-\d{2}/;

var str = '2010-12-20 2011-02-14';

if((matchArray = pattern.exec(str)) != null){

console.log(matchArray)

// ["2010-12-20", index: 0, input: "2010-12-20 2011-02-14"]

}

var pattern = /\d{4}-\d{2}-\d{2}/g;

var str = '2010-12-20 2011-02-14';

while((matchArray = pattern.exec(str)) != null){

console.log(matchArray[0], matchArray.index, matchArray.lastIndex)

// "2010-12-20" 0 10

// "2011-02-14" 11 21

}

test

在测试正则表达式能否匹配文本,反正布尔值

小心那个 lastIndex

var pattern = /^\d{4}-\d{2}-\d{2}$/g;

pattern.test("2010-12-20"); // true

pattern.test("2010-12-20"); // false

string.match(RegExp);

类似与 RegExp.exec(string) , 唯一区别是无论是否指定全局模式, Regexp.exec() 总是返回单次的匹配结果,而 string.match() 在这种情况下会返回一个字符串数组,包含各次成功匹配结果。

string.search(RegExp)

返回正则表达式在字符串中第一次匹配的位置,不成功返回 -1

string.replace(RegExp, replacement)

默认情况下它只替换一次,要设置全局模式

replacement //字符中有一些特殊变量

$num //表示对应捕获分组匹配的文本

$ //$字符

js-正则表达式-今日头条

//匹配文本之前(左侧)的文本

//匹配文本之后(右侧)的文本

string.replace(RegExp, function)

function 接收一个字符串,也返回一个字符串

"one two three".replace(/\bt[a-zA-Z]+\b/g, function(m){

return m.toUpperCase()

})

// one TWO THREE

string.split(RegExp)

使用正则来切分字符串,全局模式不影响它

var matchArray = "one two three".split(/\s+/)

关注 web翎云阁,定时推送,互动精彩多,若你有更好的见解,欢迎留言探讨!

举报
评论 0