javascript正则表达式(regular expression)


一种字符串匹配的模式,用来检查一个串是否含有某种子串、
将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
注意:在javascript中正则表达式也是一种对象
1:创建正则表达式
两种方式:隐式创建(文字量方法)和显示创建(使用构造函数)
eg:
文字量方法:var regExp = /pattern/flags;
将文字量的正则表达式赋值给一个变量,包含在两个斜杠之间的一个或多个字符,在后一个斜杠的后面,可以指定一个或多个选项。
var regExp1 = /abc/;
var regExp2 = /abc/gi;
使用构造函数:var regExp =new RegExp("pattern","flags");
构造函数RegExp()中有2个参数:
第一个参数指定正则表达式,这是正则表达式的字符串表示方法.
第二个参数是可选参数,它指定正则表达式的选项.(同上flags)
var regExp1 = new RegExp("abc");
var regExp2 = new RegExp("abc","gi");
(一)相关的语法
由普通字符和特殊字符(元字符)组成。
普通字符包括:数字,大小写字母,下划线等
特殊字符:() [] {} ^ $ * ? | + .
普通字符可以直接拿来用,特殊字符是一定要转义。
1:量词
? 出现零次或一次
* 出现零次或多次(任意次)
+ 出现一次或多次(至少一次)
{n} 对应n次
{n,m} 至少出现n次但不超过m次(中间不能有空格)
{n,} 至少出现n次
eg:
/ab*/表示一个字符串有一个a后面跟着零个或若干个b。(a, ab, abbb……)
/ab+/表示一个字符串有一个a后面跟着一个b或者更多b。 (ab, abbb……)
/ab?/表示一个字符串有一个a后面跟着零个或者一个b。 (a, ab)
/a?b+$/表示在字符串的末尾有零个或一个a跟着一个或几个b。(b, ab, abbb……)
/ab{2}/表示一个字符串有一个a跟着2个b(abb)。
/ab{2,}/表示一个字符串有一个a跟着至少2个b。(abb, abbb……)
/ab{3,5}/表示一个字符串有一个a跟着3到5个b。(abbbbb, abbb)
2:修饰符
i:表示忽略大小写,就是在字符串匹配的时候不区分大小写
g:表示全局匹配,即匹配字符串中出现的所有模式
m:表示进行多行匹配
3:中文或者
[u4e00-u9fa5]表示中文集
| 表示或
eg:
/hi|hello/表示一个字符串里有hi或者hello
/(b|cd)ef/表示bef或cdef
/(a|b)*c/表示有0个或多个a加上c或者有0个或多个b加上c;
4:预定义类
. [^ ] 除了换行和回车之外的任意字符
d [0-9] 数字字符
D [^0-9] 非数字字符
s 空白字符
S 非空白字符
w [a-zA-Z_0-9] 单词字符(所有的字母)
W [^a-zA-Z_0-9] 非单词字符
eg:
/a.[0-9]/表示一个字符串有一个a后面跟着一个除了换行和回车之外的任意字符和一个数字;
/^.{3}$/表示有任意三个字符的字符串(长度为3)
5:字符串的首尾
字符串的起始位置我们用^
eg:
/^abc/ 判断字符串是否是以abc开始的
/^The/表示所有以The开始的字符串There,The frfr等
字符串的结束位置我们用$
eg:
/xyz$/ 判断字符串是否是以xyz结尾的
6:字符集
(1)简单类
它是有一一对应的字符组成的集合,通过[]包裹住,来表示这几个字母组成的一个集合
eg:
[abc123]表示由abc123六个字符组成的一个集合
eg:
/[ab]/表示一个字符串有一个a或b
(2)范围类
通过首位字母末尾字母以及-组成的一个范围集合
[a-z] 表示小写字母集合。
eg:
/[a-d]/表示一个字符串包含小写的a到d中的一个
[A-Z] 表示大写字母集合。
eg:
/[A-D]/表示一个字符串包含小写的A到D中的一个
eg:
/^[a-zA-Z]/表示一个以字母开头的字符串
[0-9] 表示数字集合。
eg:
/[0-9]/表示一个字符串包含小写的0到9中的一个
(3)负向类
通过在[]内部最前面添加^来表示不包含该集合的字符集
eg:
[^abc] 表示不包含abc的任意字符集合
(4)组合类
通过[]将几个集合拼接在一起表示一个组合的集合。
eg:
[a-zA-Z0-9] 表示大小写字母以及数字的结合
7:预定义特殊字符
制表符
回车符
f 换页符
 与回退字符
(二)相关的方法
字符串相关方法: search, match, split
返回数字类型:search
返回数组的方法:match,split
返回字符串的方法:replace
1:split
把一个字符串分割成字符串数组。
stringObject.split(separator,howmany)
separator字符串或正则表达式(必选)
howmany该参数可指定返回的数组的最大长度(可选)
(1)正则表达式
注意''和' ';
' '表示的空格数量,一个还是两个切割
var str="Hello world"
var strarr=str.split(" ");
console.log(strarr);
//["Hello", "world"]
var str="Hello,world"
var strarr=str.split(",");
console.log(strarr);
//["Hello", "world"]
var strarr="hello".split("");
console.log(strarr);
//["h", "e", "l", "l", "o"]
var str="Hello,world"
var strarr=str.split(",",1);
console.log(strarr);
//["Hello"]
(2)正则切割
var str = 'a b c';
console.log(str.split(''))
console.log(str.split(/s+/))
//["a", " ", " ", " ", "b", " ", "c"]
//["a", "b", "c"]
2:search
获取字符在字符串中的位置
stringObject.search(regexp)
regexp字符串或者正则对象
未找到任何匹配的子串,则返回 -1。
search() 方法不执行全局匹配,忽略标志 g,总是从字符串的开始进行检索,
var str="Hello world!"
var newstr=str.search("world");
console.log(newstr);
//6
var str="Hello world!"
var newstr=str.search(/world/);
console.log(newstr);
//6
var str="abcabc!"
var newstr=str.search(/a/);
console.log(newstr);
//0
var str="abcabc!"
var newstr=str.search(/a/g);
console.log(newstr);
//0
3:match
字符串内检索指定的值,或找到一个或多个(regexp 是否具有标志 g,若不具有则执行一次匹配就结束)正则表达式的匹配。
返回包含指定的值数组,没有找到则返回一个null
stringObject.match(searchvalue)
stringObject.match(regexp)
eg:
var str = 'abbcccbbbbbddbbbdabbbsbbccdb';
console.log(str.match(/b+/g))
console.log(str.match('bb'))
//["bb", "bbbbb", "bbb", "bbb", "bb", "b"]
//["bb", index: 1, input: "abbcccbbbbbddbbbdabbbsbbccdb"]
var str="Hello world!"
console.log(str.match("world"))
console.log(str.match("World"))
// ["world", index: 6, input: "Hello world!"]
//null
4:replace
在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
stringObject.replace(regexp/substr,replacement)
regexp/substr:要替换的模式的 RegExp 对象或子字符串(必须)
regexp具有全局标志 g,将全局匹配。否则,它只替换第一个匹配子串
replacement替换文本或生成替换文本的函数(要有返回值,并且将这个返回值作为字符串)。(必须)
返回值是一个新字符串
(1)replacement表示替换文本
eg:
"abcd".replace("a","0");
//"0bcd"
"abcda".replace("a","0");
//"0bcda"
eg:
var str="Hello world world!"
var newstr=str.replace(/world/, "W")
var newstr1=str.replace(/world/g, "W")
console.log(str);
console.log(newstr);
console.log(newstr1);
//Hello world!
//Hello W!
//Hello W W!
(2)replacement表示函数,函数自带参数
replacement 中的 $ 字符具有特定的含义
$1、$2、...、$99与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
每个匹配都调用该函数,return的值就是要替换的值。
第一个参数是匹配上的字符串。
第二个参数匹配上的字符串的下标
最后一个参数是 源字符串。
var str = "你好吗,你真的好吗,你一定要好好哒";
str = str.replace(/你/g,function(a,b,d){
console.log(arguments);
return "他/她";
});
console.log(str);
//["你", 0, "你好吗,你真的好吗,你一定要好好哒"]
//["你", 4, "你好吗,你真的好吗,你一定要好好哒"]
//["你", 10, "你好吗,你真的好吗,你一定要好好哒"]
//他/她好吗,他/她真的好吗,他/她一定要好好哒
var str = "每天200元,吃饭40元";
newstr = str.replace(/d+元/g,function(a){
console.log(a);
return "$" + Math.round((parseInt(a) / 6) * 100) / 100;
});
console.log(str);
console.log(newstr);
//200元
//40元
//每天200元,吃饭40元
//每天$33.33,吃饭$6.67
(3)replacement分组
var str = "hello world";
newstr = str.replace(/(w+)s(w+)/,"$2 $1");
console.log(newstr);
//world hello
var str = "hello world";
newstr = str.replace(/(w+)s(w+)/,function(match,$1,$2,index,str){
console.log(match); //第一个匹配到的字符串
console.log($1); //第一个匹配的
console.log($2); //第二个匹配的 /////继续向后
console.log(index); //匹配到的字符串出现的位置
console.log(str); //最后一个源串
});
console.log(newstr);
//hello world
//hello
//world
//0
//hello world
var jsondata= {
xingming : "哈哈",
xingbie : "女"
}
var str = "大家好,我叫!xingming!,我是个!xingbie!生"
str = str.replace(/!(w+)!/g,function(match,$1){
return jsondata[$1];
});
console.log(str);
//大家好,我叫哈哈,我是个女生
正则相关方法: exec和test
exec返回一个数组
test返回的是布尔值
1:exec
与String对象的match()方法类似
返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
RegExpObject.exec(string)
var strreg = /abc/g;
var new1=strreg.exec('abcd');
console.log(new1);
//["abc", index: 0, input: "abcd"]
var strreg = /abc/g;
var new2=strreg.exec('abc');
console.log(new2);
//["abc", index: 0, input: "abc"]
var strreg = /abc/g;
var new3=strreg.exec('ab');
console.log(new3);
//null
2:test
检测一个字符串是否匹配某个模式.
RegExpObject.test(string)
字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false。
var mystring ="hello world World!";
var regexp = /wo/i;
console.log(regexp.test(mystring))
//true

原文地址:https://www.cnblogs.com/kelly2017/p/7220377.html