初识正则表达式
概念
*正则表达式(RegExp)*是强大的字符串匹配工具,可以极大地简化普通字符串操作容易出问题的东西。正则表达式只能操作字符串,且区分大小写。
基本语法
- 直接量语法: /pattern/attributes
1
var re=/a/i;
- 创建 RegExp 对象的语法::new RegExp(pattern, attributes);注意:参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。参数 attributes 是一个可选的字符串,包含属性 “g”、”i” 和 “m”,分别用于指定全局匹配、区分大小写的匹配和多行匹配。
1
var re=new RegExp('A','i');
RegExp对象方法:
- test()方法:检测一个字符串是否匹配某个模式。返回值是 true 或 false。
1
2var patt1=new RegExp("e");
document.write(patt1.test("The best ")); //该字符串中存在字母 "e",所以输出是true - exec()方法:检索字符串中的正则表达式的匹配。返回值是被找到的值。如果没有发现匹配,则返回 null。
1
2var patt1=new RegExp("e");
document.write(patt1.exec("The best ")); //该字符串中存在字母 "e",所以输出是e - compile()方法:改变正则表达式的模式。
1
2
3
4
5
6//在字符串中全局搜索 "man",并用 "person" 替换。然后通过 compile() 方法,改变正则表达式,用 "person" 替换 "man" 或 "woman",
var str="Every man in the world! Every woman on earth!";
patt=/(wo)?man/g;
patt.compile(patt);
Str2=str.replace(patt,"person");//用 "person" 替换 "man" 或 "woman",:
document.write(str2);
支持正则表达式的 String 对象的方法
- Search()方法:检索与正则表达式相匹配的值。不执行全局匹配,它将忽略标志 g,同时它也没有regexp对象的lastIndex的属性,且总是从字符串开始位置进行查找,总是返回匹配的第一个位置。
1
2var str="hello,world!"
document.write(str.search(/world/)); //结果返回6,即w所在的位置 - match()方法:找到一个或多个正则表达式的匹配,返回指定的值,而不是字符串的位置。
1
2var str='abcd 3458 gea2 ef';
document.write(str.match(/\d+/g));//结果为3548,2 - Replace()方法:查找并替换与正则表达式匹配的子串。
1
2var str="good girl"
document.write(str.replace(/girl/, "boy"));//使用boy替换girl - Split()方法:把一个字符串分割为字符串数组。
1
2var str="How are you ?"
document.write(str.split("") + "<br />");//结果为"H,o,w, ,a,r,e, ,y,o,u, ,?"
元字符
元字符是拥有特殊含义的字符,javascript中常见的元字符如下:
- 元字符*.* :用于匹配任何单个字符(除了换行符以外)。
1
2var str = “abcde”;
document.write(str.match(/a.c/)); // 结果为“abc” - \w:查找任意一个字母或数字或下划线。
1
2
3var str = “abcde”;// 匹配单个字符,找到一个直接返回
document.write(str.match(/\w/)); //结果为“a”
document.write(str.match(/\w+/)); //结果为“abcde” - \W:查找非单词的字符.
1
2var str = “abcde”;// 匹配单个字符,没有找到返回null
document.write(str.match(/\W/)); // 结果为“null” - \d:匹配一个数字字符。
1
2var str = “abcde111”;
document.write(/\d/g.exec(str)); //结果为“1” - \D:匹配一个非数字字符。
1
2var str = “abcde111”;
document.write(/\D+/g.exec(str)); //结果为“abcde” - \s:匹配任何空白字符,包括空格,制表符,换行符等等。
1
2var str=”Is this all there is?”;
document.write(/\s/g.exec(str)); // 结果为“ ” - \S:匹配任何非空白字符。
1
2var str=”Is this all there is?”;
document.write(/\S+/g.exec(str)); //结果为“Is” - \b:匹配一个单词边界,也就是指单词和空格间的位置。
1
2var str=”Is this all there is?”;
document.write(/\bthis\b/g.exec(str)); //结果为“this” - \B:匹配非单词边界。
1
2var str=”Is this all there is?”;
document.write(/\Bhi/g.exec(str)); // 结果为“hi” - \n:匹配一个换行符;返回换行符被找到的位置。如果未找到匹配,则返回 -1。
1
2var str=”Is this all \nthere is?”;
document.write(/\n/g.exec(str));
正则的方括号
方括号包含一系列字符,能够匹配其中任意一个字符,如[abc]可以匹配abc中任意一个字符,使用[^abc]包含的字符abc,则能够匹配abc字符之外的任何一个字符,只能是一个字符。常见的几种方括号的用法如下:
- [abc]:查找在方括号中的任意一个字符;
- [^abc]: 查找不在方括号中的任意一个字符;
- [0-9]: 查找0-9中的任意一个数字;
- [a-z]: 查找从小写a到z中的任意一个字符。
量词
- n*:匹配零个或者多个n的字符串。
1
2var str = "hello longen hello";
document.write(str.match(/el*/g)); //结果为"ell" - n+:匹配至少包含一个或者多个n的字符串。
1
2var str = "hello longen";
document.write(str.match(/l+/g)); //结果为"ll" - n?:匹配零个或者1个n的字符串,可以匹配n字符串,也可以只匹配一个n;先尽量匹配,如没有匹配到,就回溯,再进行不匹配;
1
2var str = "hello longen hello";
document.write(str.match(/hu?/g)); //结果为"h" - n{x}:匹配包含x个的n的序列字符串。X必须是数字。
1
2var str="100, 1000 or 10000?";
document.write(str.match(/\d{4}/g)); //结果为["1000", "1000"] - n{x,y}:匹配包含至少x个的n字符串,最多y个n字符串。
1
2var str="100, 1000 or 10000?";
document.write(str.match(/\d{3,}/g)); //结果为["100", "1000", "1000"] - n{x,}:匹配至少包含x个n序列的字符串;
1
2var str="100, 1000 or 10000?";
document.write(str.match(/d{3,}/g)); //结果为["100", "1000", "1000"] - n$:匹配任何以n结尾的字符串;
1
2var str="my name is longen";
document.write(str.match(/en$/g)); //结果为["en"] - ^n:匹配任何以n开头的字符串;
1
2var str="my name is longen";
document.write(str.match(/^my/g)); //结果为"my" - ?=n:匹配任何其后紧接指定字符串n的字符串;
1
2var str="my name is longen";
document.write(str.match(/na(?=m)/g)); //结果为"na" - ?!n:匹配任何其后不紧接n的字符串
1
2var str="my name is longen";
document.write(str.match(/na(?!ma)/g)); //结果为"na" - ^ 以字符串开始的地方匹配,不匹配任何字符;
- $ 以字符串结束的地方匹配,不匹配任何字符;
应用
正则表达式在javascript中的应用挺广泛的,可以说带来很多的方便,这里就列举两个应用:
- 行首行尾去空格
1
2
3var str=' www ee d;fl ';
var re=/^\s+|S+&/;//行首行尾去空格
document.write('('+str.replace(re,'')); - 校验邮箱
1
2
3
4
5var re=/^\w+@[a-z0-9]+\.[a-z]{2-4}$/;
if(re.test(oTxt.value))
{ alert('right'); }
else
{ alert('wrong'); }