什么是正则表达式

在常见的字符串检索或者替换中,我们需要提供一种模式表示检索或者匹配的规则。正则表达式就是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。

创建正则表达式的2种方式及区别

使用构造函数

var regObj = new RegExp("\d{1,6}“,"g");

使用RegExp构造函数,他接收2个参数,一个是要匹配的字符串模式,一个是可选的标志字符串。需要注意的是传给RegExp构造函数的2个参数都是字符串。正则表达式的匹配模式支持下列3个标志
0. g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止。

  1. i:表示不区分大小写(case-insensitive)模式, 即在确定匹配项时忽略匹配模式与字符串的大小写。
  2. m: 表示多行( multiline )模式,即在达到一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。

使用字面量语法

var regObj = /\d{1,6}/g;

注意事项

  • 模式中所有元字符必须进行转义,正则表达式中元字符包括( [ { \ ^ $ | ) ? * + .]},这些元字符在正则表达式中都有一种或者多种特殊用途。
var pattern4 = /.at/gi;     //匹配所有以 "at"  结尾的 3个字符的组合,不区分大小写。  
   var pattern4 = /\.at/gi;   //匹配所包含.at模式的字符串
  • 不要把正则表达式字面量直接传给构造函数。
  • 如果构造函数模式含有元字符,则需要对元字符进行双重转义(eg:字符\在字符串中通常被转义为\,而在正则表达式字符串就会变成\\)。例如字面量模式/[bc]at/和字符串模式"\[bc\]at"是等价的。

字符说明

常用字符

\d : 匹配任意一个数字,0~9 中的任意一个
\s : 匹配任意一个空白字符
\b : 匹配一个单词边界,不匹配任何字符
\w : 匹配任意一个字符( 字母、 数字、下划线 ) . : 匹配任意一个字符,除了换行符( \n )
\n : 查找换行符
\u : 通常用来匹配汉字
表达式 "\d","\s","\b","\w",对应的大写字母表示相反的意义 如:\D 匹配所有的非数字字符

方括号:

[abc] : 查找方括号之间的任何字符。
[^abc] : 查找任何不在方括号之间的字符。
[0-9] : 查找任何从 0 至 9 的数字。
[a-z] : 查找任何从小写 a 到小写 z 的字符。
[A-Z] : 查找任何从大写 A 到大写 Z的字符。

量词:

n+ : 匹配任何包含至少一个 n 的字符串。
n? : 匹配任何包含零个或一个 n 的字符串。
n* : 匹配任何包含零个或多个 n 的字符串。
n{X} : 匹配包含 X 个 n 的序列的字符串。
n{X,Y} : 匹配包含 X 到Y 个 n 的序列的字符串。
^n : 匹配任何开头为 n 的字符串。
n$ : 匹配任何结尾为 n 的字符串。

()、[]、{} 的区别

() 的作用是提取匹配的字符串。表达式中有几个()就会得到几个相应的匹配字符串。比如 (\s+) 表示连续空格的字符串。
[]是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示字符文本要匹配英文字符和数字。
{}一般用来表示匹配的长度,比如 \d{3} 表示匹配三个空格,\d[1,3]表示匹配1~3个空格。

^ 和 $

^ 匹配一个字符串的开头,比如 (^a) 就是匹配以字母a开头的字符串
$ 匹配一个字符串的结尾,比如 (b$) 就是匹配以字母b结尾的字符串
^ 还有另个一个作用就是取反,比如[^xyz] 表示匹配的字符串不包含xyz
需要注意的是:如果^出现在[]中一般表示取反,而出现在其他地方则是匹配字符串的开头

RegExp实例常用方法

  • test() 检索字符串中指定的值,返回值为true或者false。
  • exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。
  • compile()用于改变RegExp,既可以改变检索模式,也可以添加或删除第二个参数。
  • toString() 返回正则表达式的字符串表示形式

String类型与正则相关的方法

  • search():检索与正则表达式相匹配的值 用法:str.search(reg); (返回索引值,无-1)
"abcabcdef".search(/(abc)\1/);    //0
  • match():返回所有正则表达式的匹配(加g) 用法:str.match(reg); (返回数组)
"abbbccbb".match(/b+/g)   //["bbb", "bb"]
  • replace():替换与正则表达式匹配的子串 用法:str.replace(reg,"");
"abcabcdef".replace(/b+?/,"x");    //"axcabcdef"
"abcabcdef".replace(/b+?/g,"x");    //"axcaxcdef"
  • split:将字符串匹配的部分做分割(去除) 用法:str.split(reg); (返回数组)
"abbbccbb".split(/b+/g)   //["a", "cc", ""]

应用例子

  1. 校验上传app的版本号,要求格式为X.X.X,其中X代表数字。
var pattern = /\d+\.\d+\.\d+/;
        if (!pattern.test($scope.version)) {
            madpFactory.layerMsg({
                "CN": "版本号格式不正确。",
                "EN": "The format of version number is wrong."
            }, 0);
            flg = false;
        }
  1. 将后台返回模板中“【】”替换为当前登录店铺的用户名。
piece.replayContent = data.data.generateContent;
  var pattern = new RegExp("【】");
   if (pattern.test(piece.replayContent)) {
  piece.replayContent = piece.replayContent.replace(/【】/g,  $scope.shopName.value                                                    
   }

3.校验手机号

let  pattern = /^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(166)|(147))\d{8}$/