正则表达式
正则表达式(Regular Expression)是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
在 JavaScript中,正则表达式也是对象。
创建正则表达式
JavaScript通过内置对象RegExp支持正则表达式,有两种方式创建正则表达式对象:
-
构造函数
var reg=new RegExp('正则表达式','g'); -
字面量
var reg=/ 正则表达式 /g;
常见修饰符
字符 | 含义 |
---|---|
g | global,全文搜索,不添加的话搜索到第一个结果停止搜索 |
i | ignore case ,忽略大小写,默认大小写敏感 |
m | multiple lines,多行搜索 ,会修改^和$的行为 |
正则表达式的元字符
指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
( [ { \ ^ $ | ) ? * + .
并不是每个元字符都有特定的意义,在不同的组合中元字符有不同的意义。
取反
字符 | 含义 |
---|---|
[^xyz] | 一个反向字符集。匹配任何没有包含在方括号中的字符。可以使用破折号(-)来指定一个字符范围。任何普通字符在这里都是起作用的 |
范围类
可以使用破折号(-)来指定一个字符范围。
比如:
[0123456789] 与 [0-9]表示的意思是一样的;
[0-9a-zA-Z] 表示这个字符可以是大写字母、小写字母、数字中的任意一个
预定义类
字符 | 等价类 | 含义 |
---|---|---|
. | [^\r\n] | (小数点)匹配除换行符之外的任何单个字符 |
\d | [0-9] | 匹配一个数字 |
\D | [^0-9] | 匹配一个非数字字符 |
\s | [ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] | 匹配一个空白字符,包括空格、制表符、换页符和换行符 。例如: /\s\w*/ 匹配"foo bar."中的' bar' |
\S | [ ^\f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] | 匹配一个非空白符 ,例如, /\S\w*/ 匹配"foo bar."中的'foo' |
\w | [a-zA-Z_0-9] | 匹配一个单字字符(字母、数字或者下划线) |
\W | [^a-zA-Z_0-9] | 匹配一个非单字字符 |
常用的边界匹配字符
字符 | 含义 |
---|---|
^ | 以 xxx开头,匹配输入的开始。如果多行标志被设置为true,那么也匹配换行符后紧跟的位置 |
$ | 以 xxx结尾, 匹配输入的结束。如果多行标示被设置为true,那么也匹配换行符前的位置 |
\b | 匹配一个词的边界(空格或字符串开头,- 也是单词边界)。一个词的边界就是一个词不被另外一个词跟随的位置或者不是另一个词汇字符前边的位置。注意,一个匹配的词的边界并不包含在匹配的内容中。换句话说,一个匹配的词的边界的内容的长度是0。(不要和[\b]混淆了) |
\B | 匹配一个非单词边界。他匹配一个前后字符都是相同类型的位置:都是单词或者都不是单词。一个字符串的开始和结尾都被认为是非单词 |
量词
字符 | 含义 |
---|---|
? | 匹配前面一个表达式出现0次或者1次。等价于 {0,1}。 如果紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪的(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反 |
+ | 匹配前面一个表达式1次或者多次。等价于 {1,} |
* | 匹配前一个表达式0次或多次。等价于 {0,} |
{n} | n是一个正整数,匹配了前面一个字符刚好发生了n次 |
{n,m} | n 和 m 都是整数。匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略 |
{n,} | n是一个正整数,匹配了前面一个字符至少发生了n次。 |
贪婪模式与非贪婪模式
- 贪婪模式: 量词在默认下是尽可能多的匹配的
- 非贪婪模式 :让正则表达式尽可能少的匹配,也就是说一旦成功匹配不再继续尝试,在量词后加上?即可
分组
到目前为止,我们只能一个字符到匹配,虽然量词的出现,能帮助我们处理一排密紧密相连的同类型字符。但这是不够的,下面该轮到小括号出场了,中括号表示范围内选择,大括号表示重复次数。小括号允许我们重复多个字符。
前瞻
继续在分组内做文章。前瞻与后瞻其实都属于零宽断言,但javascript不支持后瞻
表达式 | 含义 |
---|---|
exp1(?=exp2) | 匹配后面是exp2的exp1 |
exp1(?!exp2) | 匹配后面不是exp2的exp1 |
使用正则表达式的方法
方法 | 语法 | 含义 | 返回值 |
---|---|---|---|
test | regexObj.test(str),其中str指用来与正则表达式匹配的字符串 | 执行一个检索,用来查看正则表达式与指定的字符串是否匹配 | 返回 true 或 false |
exec | regexObj.exec(str) | exec() 方法在一个指定字符串中执行一个搜索匹配 | 如果匹配成功,exec() 方法返回一个数组,并更新正则表达式对象的属性。返回的数组将完全匹配成功的文本作为第一项,将正则括号里匹配成功的作为数组填充到后面。 如果匹配失败,返回 null |
search | str.search(regexp) | search() 方法执行正则表达式和 String对象之间的一个搜索匹配 | 如果匹配成功,则 search() 返回正则表达式在字符串中首次匹配项的索引。否则,返回 -1 。不执行全局匹配 |
match | str.match(regexp) | 当一个字符串与一个正则表达式匹配时, match()方法检索匹配项 | 如果字符串匹配到了表达式,会返回一个数组,数组的第一项是进行匹配完整的字符串,之后的项是用圆括号捕获的结果。如果没有匹配到,返回null |
replace | str.replace(regexp |substr, newSubStr|function) | replace() 方法返回一个由替换值替换一些或所有匹配的模式后的新字符串。模式可以是一个字符串或者一个正则表达式, 替换值可以是一个字符串或者一个每次匹配都要调用的函数 | 一个部分或全部匹配由替代模式所取代的新的字符串 |
split | str.split([separator[, limit]]) | split() 方法使用指定的分隔符字符串将一个String对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置 |
工具
参考 : 司徒正美 JavaScript正则表达式
网友评论