RegExp正则
RegExp对象表示正则表达式,它是对字符串执行模式匹配的工具;
new RegExp(pattern,attributes);
理解javascript中的元字符
元字符. 用于匹配任何单个字符(除了换行符以外)
基本语法:new RegExp("regexp.") 或者直接量语法 /regexp./
比如代码如下:
var str = "abcde";
console.log(str.match(/a.c/)); // ["abc", index: 0, input: "abcde"]
*
匹配前面的字符零次或多次 等同于 {0,}
var str = "hello world";
console.log(str.match(/hello*/));
+
匹配前面的字符一次或多次 等同于 {1,}
var str = "hello world";
console.log(str.match(/hello+/));
?
匹配前面的字符零次或一次 等同于 {0,1}
var str = "hello world";
console.log(str.match(/hello?/));
|
匹配两个或多个选择
var str = "hello world";
console.log(str.match(/hello|world/));
^
匹配字符串的开始位置
var str = "hello world";
console.log(str.match(/^hello/));
$
匹配字符串结束位置
var str = "hello world";
console.log(str.match(/hello$/));
[]
匹配方括号中的任一字符
var str = "hello world";
console.log(str.match(/[abcd]/));
[^]
匹配除方括号中的字符外的任何字符
var str = "hello world";
console.log(str.match(/[^abcd]+/));
\w
查找任意一个字母或数字或下划线,等价于AZa_z0_9,
基本语法:new RegExp("\w"); 或 直接量语法:/\w/
比如代码如下:
var str = "abcde";
// 匹配单个字符,找到一个直接返回
console.log(str.match(/\w/)); // ["a", index: 0, input: "abcde"]
// 匹配所有字符
console.log(str.match(/\w+/)); //["abcde", index: 0, input: "abcde"]
\W
查找非单词的字符
基本语法:new RegExp("\W") 或直接量 /\W/
var str = "abcde";
// 匹配单个字符,没有找到返回null
console.log(str.match(/\W/)); // null
\d
匹配与一个数字字符
基本语法:new RegExp("\d"); 或 直接量语法:/\d/
代码如下:
var str = "abcde111";
console.log(/\d/g.exec(str)); // ["1", index: 5, input: "abcde111"]
\D
匹配一个非数字字符
基本语法:new RegExp("\D") 或直接量 /\D/
如下测试代码:
var str = "abcde111";
console.log(/\D+/g.exec(str)); // ["abcde", index: 0, input: "abcde111"]
\s
匹配任何空白字符,包括空格,制表符,换行符等等。
基本语法:new RegExp("\s") 或直接量 /\s/
如下测试代码:
var str="Is this all there is?";
console.log(/\s/g.exec(str));
// [" ", index: 2, input: "Is this all there is?"]
\S
匹配任何非空白字符,
基本语法:new RegExp("\S") 或直接量 /\S/
如下测试代码:
var str="Is this all there is?";
console.log(/\S+/g.exec(str));
// ["Is", index: 0, input: "Is this all there is?"]
\b
匹配一个单词边界,也就是指单词和空格间的位置,比如’er\b’可以匹配"never"中的"er",但是不能匹配"verb"中的"er"
基本语法:new RegExp("\bregexp") 或直接量 /\bregexp/
如下测试代码:
var str="Is this all there is?";
console.log(/\bthis\b/g.exec(str));
// ["this", index: 3, input: "Is this all there is?"]
\B
匹配非单词边界,’er\B’能匹配’verb’中的’er’,但不能匹配’never’中的’er’
基本语法:new RegExp("\Bregexp") 或直接量 /\Bregexp/
测试代码如下:
var str="Is this all there is?";
console.log(/\Bhi/g.exec(str));
// ["hi", index: 4, input: "Is this all there is?"]
\n
匹配一个换行符;返回换行符被找到的位置。如果未找到匹配,则返回 null。
基本语法:new RegExp("\n") 或直接量 /\n/
如下测试代码:
var str="Is this all \nthere is?";
console.log(/\n/g.exec(str));
// ["换行符", index: 12, input: "Is this all ?there is?"]
贪婪模式与非贪婪模式讲解
var str = "longen<p>我是中国人</p>yunxi<p>我是男人</p>boyboy";
// 贪婪模式 匹配所有字符
console.log(str.match(/<p>.*<\/p>/)[0]);
// <p>我是中国人</p>yunxi<p>我是男人</p>
// 后面加问号,变成非贪婪模式
console.log(str.match(/<p>.*?<\/p>/)[0]); // <p>我是中国人</p>
i 不区分大小写
var str = "HELLO WORLD";
console.log(str.match(/hello/i));
m 视为多行
var str = "HELLO WORLD\r\n asdasd \r\nabc";
console.log(str.match(/^abc/m));
g 全局匹配
如果不带g,正则过程中字符串从左到右匹配,找到第一个符合条件的即匹配成功,返回
如果带g,则字符串从左到右,找到每个符合条件的都记录下来,直到字符串结尾位置
var str = 'aaaaaaaa'
console.log(str.match(/a/));
console.log(str.match(/a/g));
s 匹配空白字符
var str = "aggab\nacbs";
console.log(str.match(/b./s));
正则方法
var str = "hello world";
console.log(str.match("hello")); // ["hello", index: 0, input: "hello world"]
console.log(str.match("Hello")); // null
console.log(str.match(/hello/)); // ["hello", index: 0, input: "hello world"]
var str = "longen and yunxi";
console.log(/longen/.test(str)); // true
console.log(/longlong/.test(str)); //false
// 或者创建RegExp对象模式
var regexp = new RegExp("longen");
console.log(regexp.test(str)); // true
var str = "longen and yunxi";
console.log(/longen/.exec(str));
// 打印 ["longen", index: 0, input: "longen and yunxi"]
// 假如没有找到的话,则返回null
console.log(/wo/.exec(str)); // null
正则表达式实战
- 1.匹配以数字结尾的;
正则:/\d+$/g;
- 2.去掉空格;
var str = "我 是 龙 恩";
console.log(str.replace(/\s+/g,""));//我是龙恩
- 3.判断字符串是不是由数字组成;
var str = "123344我 是 龙 恩 1123344";
console.log(/^\d*$/.test(str)); //false
var str2 = "123445566";
console.log(/^\d*$/.test(str2)); // true
- 4.电话号码正则
分析如下:电话号码有区号(3-4位数字),区号之后使用 "-" 与电话号码连接;
区号正则:^\d{3,4}
电话号码7~8位 正则 \d{7,8}
电话号码也有分机号,分机号为3-4位数字,非必填项,如果要填写的话,则以"-"与电话号码相连接。
正则(-\d{3,4})?
因此正则匹配电话号码正则为:
/^\d{3,4}-/d{7,8}(-\d{3,4})?$/;
- 5.手机号码正则
手机号码需要匹配;手机号码开头不以0开始的,并且是11位数字,目前的手机号码有如下开头的:13,14,15,17,18开头的;因此正则如下:
/(^1[3|4|5|7|8][0-9]{9}$)/
如下测试代码:
var str = 15606512345;
var reg = /(^1[3|4|5|7|8][0-9]{9}$)/;
console.log(reg.test(str)); //true
- 6.删除字符串左右空格
// 删除字符串两侧的空白
/*
* 下面的正则的含义是以1个或者多个空白开头的
* | 是或者的意思 或者以1个或者多个空白结尾的
* 也就是去掉头部和尾部的1个或者多个空格
*/
function trim(str) {
return str.replace(/^\s+|\s+$/g,'');
}
var str1 = " 1234 ";
console.log(trim(str1)); // 输出去掉空格的 1234
- 7.限制文本框只能输入数字和小数点(二位小数点)
分析:开头有0个或者多个数字,中间有0个或者1个小数点,小数点后面有0个或者最多2个数字;
/^\d*\.?\d{0,2}$/
//测试代码如下:
var reg = /^\d*\.?\d{0,2}$/;
var str1 = .9;
console.log(reg.test(str1)); // true
var str2 = 1.99;
console.log(reg.test(str2)); // true
var str3 = "1a.99";
console.log(reg.test(str3)); // false
- 8.替换小数点前面的内容为指定内容
var href = "aa.php?d=1";
var reg = href.replace(/\b^(\w*)(?=\.)/,"bb");
console.log(reg); // bb.php?d=1
- 9.匹配中文的正则
使用 Unicode,必须使用\u开头,接着是字符编码的四位16进制表现形式。
console.log(/[\u4E00-\u9FA5\uf900-\ufa2d]/g.test("我是")); //true
- 10.返回字符串中,中文字符的个数
var str = "111我是涂根华说得对aaaaa1234556";
var reg = /[^u4E00-u9FA5uf900-ufa2d]/g;
var val = str.replace(reg,'');
console.log(val); // 111aaaaa1234556
console.log(val.length); // 长度为 15
- 11.正则获取ip地址的前三段
var ip = "192.168.16.162";
console.log(ip.replace(/\.\d{1,3}$/,""));// 192.168.16
- 12.匹配标签中的内容
var str2 = "<ul><li>aaa</li><li>bbb</li></ul>";
str2.match(/<ul>([\s\S]+?)<\/ul>/g);
console.log(RegExp.$1); //<li>aaa</li><li>bbb</li>
- 13.匹配标签中的文本
var str3 = "<ul><li>aaa</li><li>bbb</li></ul>";
var c = str3.replace(/<\/?[\s\S]+?>/gi,"");
console.log(c); // aaabbb
- 14.正则获取文件名
var s1 = "c:\\images\\tupian\\06.jpg",
s2 = "c:\\images\\tupian\\aa.jpg",
s3 = "c:/images/tupian/test2.jpg";
function getFileName(str){
var reg = /[^\\\/]*[\\\/]+/gi;
str = str.replace(reg,'');
return str;
}
console.log(getFileName(s1)); // 006.jpg
console.log(getFileName(s3)); // test2.jpg
- 15.绝对路径变成相对路径
var reg = /http:\/\/[^\/]+/g;
var r1 = "http://172.16.28.162/images/a.jpg";
console.log(r1.replace(reg,'.')); // ./images/a.jpg
- 16.用户名正则
var reg = /^[\u4E00-\u9FA5\uf900-\ufa2d\w]{4,16}$/;
var str = "我是12345678aa_123";
console.log(reg.test(str)); // true
var str = "我是12345678aa_1235";
console.log(reg.test(str)); // 17位 false
- 17.匹配英文地址
var reg = /^[a-zA-Z][\.a-zA-Z\s,0-9]*?[a-zA-Z]+$/;
var str1 = "11aa";
console.log(reg.test(str1)); // false
var str2 = "aa111aaa";
console.log(reg.test(str2)); // true
- 18.匹配价格
var reg = /^\d*(\.\d{0,2})?$/
var num1 = 12;
console.log(reg.test(num1)); // true
var num2 = .01;
console.log(reg.test(num2)); // true
var num3 = 1.01;
console.log(reg.test(num3)); // true
var num4 = "1.aa1";
console.log(reg.test(num4)); //false
var num5 = "1.1a";
console.log(reg.test(num5)); //false
- 19.身份证号码的匹配
匹配规则:身份证号码有15位或者18位,其中最后一位可能是X,其他全是数字
正则: /^(\d{14}|\d{17})(\d|[xX])$/
var reg = /^(\d{14}|\d{17})(\d|[xX])$/;
var identity1 = "36232919578996x";
console.log(reg.test(identity1)); // true
var identity2 = "36232919578996a";
console.log(reg.test(identity2)); // false
// 16位
var identity3 = "362329195789961x";
console.log(reg.test(identity3)); // false
- 20.单词的首字母大写
function replaceReg(reg,str) {
// 先转换为小写
str = str.toLowerCase();
return str.replace(reg,function(m){
return m.toUpperCase();
});
}
var reg = /\b(\w)|\s(\w)/g;
var str = "aadfdfCC";
console.log(replaceReg(reg,str)); // Aadfdfcc
- 21.验证日期格式
var reg = /^\d{4}[-\/]\d{1,2}[-\/]\d{1,2}$/;
var d1 = "2015-12-1";
console.log(reg.test(d1)); //true
var d2 = "2015-12-02";
console.log(reg.test(d2)); //true
var d3 = "2015/12/12";
console.log(reg.test(d3)); // true
- 22.验证邮箱的正则表达式
var reg = /^([a-zA-Z_0-9-])+@([a-zA-Z_0-9-])+(\.[a-zA-Z_0-9-])+/;
var email1 = "tugenhua@126.com";
console.log(reg.test(email1)); //true
var email2 = "879083421_aaAA@qqAAzz_AA.comaaa";
console.log(reg.test(email2)); // true
- 23.匹配代码中的a链接
var reg = /<a[.\s]*href\s*=\s*'http:\/\/.*'>\w*<\/a>/gi;
var html = "<div><a href='http://www.baidu.com'>222</a><p>344</p></div>";
console.log(html.match(reg)); // ["<a href='http://www.baidu.com'>222</a>"]
var html2 = "<div><a href='http://www.baidu.com'>222</a><p>344</p><a href='http://www.baidu2.com'>333</a></div>";
console.log(html2.match(reg)); //["<a href='http://www.baidu.com'>222</a><p>344</p><a href='http://www.baidu2.com'>333</a>"]
- 24.过滤HTML标签
var str = "<p>dasdsa</p>nice <br> test</br>"
var regx = /<[^<>]+>/g;
str = str.replace(regx, '');
console.log(str);
- 25.给一个连字符串例如:get-element-by-id转化成驼峰形式。
var str = "get-element-by-id";
var reg = /-\w/g; // 匹配横杆以及之后的一个字符,全局匹配
console.log(str.replace(reg, function ($0) {
return $0.slice(1).toUpperCase();
// 匹配到到是-e -b -i 形式截取后一个字符转成大写
}));