首页 > 代码库 > Javascript正则表达式
Javascript正则表达式
正则表达式
正则用来从字符串筛选出子字符串。
简单使用
-
编辑器搜索时,勾选上正则,可以搜索出满足特定条件的结果。
\bfunction\b
这样可以搜索出function单词。 -
做搜索功能时
?12345var
reg =
new
RegExp(inpStr);
apps.forEach(
function
(v, i) {
if
(reg.test(v.name))
// 正则的test方法
retApps.push(v);
});
-
字符串部分字符替换
?12345var
out =
"fas8fv4gjnb2dsiou1"
.replace(/\d/g,
function
(item){
if
(Number(item)%2 == 0)
return
Number(item)+1;
return
item;
})
/\d/g
就是正则
两种定义方式
-
/.../ 声明
/java/
可以匹配任何包含java子串的字符串 -
构造函数RegExp
?1new
RegExp(
‘[/]‘
,
‘g‘
)
构造函数可传入两个参数,第一个参数是字符串,若有转义,用"\",比如"\\",第二个参数是修饰符(i、g、m)。动态创建正则表达式时只能用构造函数,(虽然eval也可以使用)。
修饰符和属性
-
正则的修饰符
-
i
忽视大小写 -
g
全局匹配 -
m
多行匹配模式 常与^、&配合使用
-
-
正则的实例属性
source
、global
、ignoreCase
、multiline
、lastIndex
(可读写)
正则的语法
字符
正则表达式中所有的字母和数字都是按照其字面含义进行匹配的,也支持()开头的转义
常用转义字符列表
转义字符 | 含义 |
---|---|
\n | 换行符 |
\r | 回车符 |
\t | 制表符 |
特殊含义的标点符号,必须使用前缀\,为求保险,可以在每个标点符号前都加上反斜线。
比如 /\\/
用以匹配任何包含反斜线的字符串
字符类
把字符放到方括号内,就构成了字符类。
-
可以使用连字符;
-
可以是转义字符;
-
可以用
^
来否定字符类。
[a-zA-Z0-9]
就是字符类
预定义类 | 含义 |
---|---|
. | 除了换行符合其他Unicode行终止符之外的任何字符 |
\w | 任何ASCII字符组成的单词,等价于[a-zA-Z0-9] |
\W | 任何不是ASCII字符组成的单词,等价于[^a-zA-Z0-9] |
\s | 任何Unicode空白符 |
\S | 任何非Unicode空白符的字符,注意\w和\S不同 |
\d | 任何ASCII数字,等价于[0-9] |
\D | 除了ASCII数字之外的任何字符,等价于[^0-9] |
重复
{n,m}
n到m次;
{n,}
n以上次;
{n}
n次;
?
0到1次;
+
1到n次;
*
0次以上
-
贪婪的重复:默认,尽可能多的匹配。
比如
/a+/
匹配字符串"aaa"时,返回的是"aaa"。 -
非贪婪的重复:加上
?
。比如
/a+?/
匹配字符串"aaa"时,返回的是"a"
注意: /a+?b/匹配“aaab“时,匹配的结果仍是aaab,因为匹配的时候,是从第一个字符开始的。
选择项
选择项|
从左到右匹配,直到发现匹配项,就停止匹配,类似Js运算符‘||‘
eg./ab|cd|ef/可以匹配字符串"ab","cd","ef"。
分组和引用 ()
-
作用一:把单独的项组合成子表达式,就可以一个单元一个单元地处理
|
、*
、\
、?
eg./java(script)?/
-
作用二:在完整模式中定义子模式;这样可在同一正则表达式后面引用前面子表达式,通过字符“\”后加数字来引用,数字是参与计数的左括号的位置(初始值1),不能在字符类中使用引用
?123456789101112131415/**
* 引用的使用 $1和字符串混杂用,别当成变量
*/
var
sToMatch =
"#123456789"
;
var
reNumbers = /
#(\d+)/;
reNumbers.test(sToMatch);
console.log(RegExp.$1);
/([
‘"])[^‘
"]*\1/;
// 如果这样用就错了/([‘"])[^\1]*\1/
// 在replace中使用引用
var
sToChange = "1234 5678
";
var reMatch = /(\d{4}) (\d{4})/;
var sNew = sToChange.replace(reMatch, "
$2 $1");
//sNew 5678 1234
单纯的分组 (?: 内容 )
指定匹配位置
^
匹配字符串的开头,在多行检索中,匹配一行的开头
$
匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b
匹配一个单词的边界,一种情况
1 2 3 4 5 6 | /** * 使用\b,这种情况比较特殊 */ var str = ‘.java is very good‘ ; var match = /\b([\w]+)\b/.exec(str); //0:java 1:java index:1 input:.java is very good |
\B
匹配非单词的位置
(?= p)先行断言
(!= p)先行断言
正则的方法
search
1 2 | var data = http://www.mamicode.com/ "123123,213,12312,312,3,Cat,cat,dsfsdfs," ; console.log(data.search(reCat)); // 23 |
字符串String的方法,唯一的参数是正则,返回第一个与之匹配的字串的起始位置,从0开始计数;若没找到,返回-1。
传入的参数若不是正则表达式,自动转化成正则,不支持全局搜索。
repalce
字符串String的方法,第一个参数是正则表达式,第二个参数是要替换的字符串,返回替换后的新字符串,被作用的字符串不变;g是全局搜索替换标志,若第一个参数是字符串,字符串直接替换匹配的字符串。第二个参数若有$加数字,且正则表达式有相应子表达式,则使用引用替换。
第二个参数还可以是函数,函数的第一个参数是匹配的字符串,第二个参数开始,是模式匹配的括号的子表达式字符串,然后是匹配字符串的位置,最后是当前字符串。return返回替换的字符串。
1 2 3 4 | var str= "acd6fadf9fa5fa" ; var newStr = str.replace(/\d/g, function (item){ return parseInt(item)+7; }) |
match
1 2 3 | var data = http://www.mamicode.com/ "123123,213,12312,312,3,Cat,cat,dsfsdfs," ; var reCat = /cat/gi; var arrMactches = data.match(reCat) //0:Cat 1:cat |
字符串String的方法,唯一的参数是正则,返回由匹配的(所有)字符子串和RegExp子表达式组成的数组;若没找到,返回null。
传入字符串时,注意要用转义字符,js会自动转化成正则表达式,支持g;当match传入非全局的正则时,效果与exec一样,这时返回的数组有两个属性,index和input,index表示匹配字串前有几个字符。。
split
1 2 | var data = http://www.mamicode.com/ "1 , 2, 3,4, 5" ; var arrRes = data.split(/\s*,\s*/); |
将调用它的字符串拆成一个字串组成的数组,参数是分隔符,分隔符可以是正则表示式
exec
1 2 | var tt = "#fdas.fa" tt = /[\w]+/.exec(tt); // tt 0:fdas, index:1, input:"#fdas.fa" |
正则的方法,传入字符串,返回由匹配字符子串和RegExp子表达式组成的数组,数组的input属性是正在检索的字符串;找不到匹配,则返回null;
正则具有全局修饰符g时,查找时会与lastIndex一起配合,查询到字串后,将lastIndex置为字串所在字符串的后一位,第二次查找,会从lastIndex位置开始,若未找到匹配,自动将lastIndex置为0。
1 2 3 4 5 6 7 8 9 | /** * lastIndex值的变化 */ var pattern = /Java/g; var text = "JavaScript is more fun than Java!" ; var result; while ((result = pattern.exec(text)) !== null ) { console.log(result + ‘index‘ + result.index + ‘lastIndex‘ + pattern.lastIndex); } |
test
行为与exec类似,只不过返回的是true或false
例子
-
取函数名字 /function\s([^(](/
?1234Function.prototype.getName =
function
() {
if
(
"name"
in
this
)
return
this
.name;
return
this
.name =
this
.toString().match(/
function
\s*([^(]*)\(/)[1];
};
参考
javascript正则表达式-司徒正美
JavaScript权威指南