RegExp正则


RegExp对象表示正则表达式,它是对字符串执行模式匹配的工具;

new RegExp(pattern,attributes);

理解javascript中的元字符

元字符 描述
. 查找任意的单个字符,除换行符外
* 匹配前面的字符零次或多次 等同于 {0,}
+ 匹配前面的字符一次或多次 等同于 {1,}
? ? 匹配前面的字符零次或一次 等同于 {0,1}
匹配两个或多个选择
^ 匹配字符串的开始位置
$ 匹配字符串结束位置
[] 匹配方括号中的任一字符
匹配除方括号中的字符外的任何字符
\w 任意一个字母或数字或下划线,AZa_Z0_9,中任意一个
\W 查找非单词的字符,等价于^AZa_z0_9
\d 匹配一个数字字符,等价于0-9
\D 匹配一个非数字字符,等价于^0-9
\s 匹配任何空白字符,包括空格,制表符,换行符等等。等价于[\f\n\r\t\v]
\S 匹配任何非空白字符,等价于^\f\n\r\t\v
\b 匹配一个单词边界,也就是指单词和空格间的位置,比如’er\b’可以匹配"never"中的"er",但是不能匹配"verb"中的"er"
\B 匹配非单词边界,’er\B’能匹配’verb’中的’er’,但不能匹配’never’中的’er’查找NUL字符。
\n 匹配一个换行符
\f 匹配一个换页符
\r 匹配一个回车符

元字符. 用于匹配任何单个字符(除了换行符以外)

基本语法: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 形式截取后一个字符转成大写 
}));





powered by GitbookEdit Time: 2023-04-08 10:28:32