1.正则表达式

正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。
搜索模式可用于文本搜索和文本替换

什么是正则表达式?

正则表达式是由一个字符序列形成的搜索模式。
当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
正则表达式可以是一个简单的字符,或一个更复杂的模式。
正则表达式可用于所有文本搜索和文本替换的操作。

语法

/正则表达式主体/修饰符(可选)
其中修饰符是可选的。
实例:
var patt = /runoob/i
实例解析:
/runoob/i 是一个正则表达式。
runoob 是一个正则表达式主体 (用于检索)。
i 是一个修饰符 (搜索不区分大小写)。


使用字符串方法

在Javascript中,正则表达式通常有两个字符串方法:replace()和seach()
search()方法 用于检索字符串中指定的字符串,或检索与正则表达式相匹配的子字符串,返回子串的起始位置
replace()方法 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串

search() 方法使用正则表达式

实例
使用正则表达式搜索 “Runoob” 字符串,且不区分大小写:
var str = "Visit Runoob!";
var n = str.search(/Runoob/i);
输出结果为:
6

search() 方法使用字符串

search 方法可使用字符串作为参数。字符串参数会转换为正则表达式:
实例
检索字符串中 “Runoob” 的子串:
var str = "Visit Runoob!";
var n = str.search("Runoob");

replace() 方法使用正则表达式

实例
使用正则表达式且不区分大小写将字符串中的 Microsoft 替换为 Runoob :

  1. <body>
  2. <p>替换 "microsoft" 为 "Runoob" :</p>
  3. <button onclick="myFunction()">点我</button>
  4. <p id="demo">Visit Microsoft!</p>
  5. <script>
  6. function myFunction() {
  7. var str = document.getElementById("demo").innerHTML;
  8. var txt = str.replace(/microsoft/i,"Runoob");
  9. document.getElementById("demo").innerHTML = txt;
  10. }
  11. </script>
  12. </body>

图片.png图片.png

replace() 方法使用字符串

replace() 方法将接收字符串作为参数:
var txt = str.replace("Microsoft","Runoob");


正则表达式模式

完整原文链接:http://c.biancheng.net/view/5632.html
正则表达式的语法体现在字符模式上。字符模式是一组特殊格式的字符串,它由一系列特殊字符和普通字符构成,其中每个特殊字符都包含一定的语义和功能。

描述字符

根据正则表达式语法规则,大部分字符仅能够描述自身,这些字符被称为普通字符,如所有的字母、数字等。
元字符就是拥有特动功能的特殊字符,大部分需要加反斜杠进行标识,以便于普通字符进行区别,而少数元字符,需要加反斜杠,以便转译为普通字符使用。JavaScript 正则表达式支持的元字符如表所示。

元字符 描述
. 查找单个字符,除了换行和行结束符
\w 查找单词字符
\W 查找非单词字符
\d 查找数字
\D 查找非数字字符
\s 查找空白字符
\S 查找非空白字符
\b 匹配单词边界
\B 匹配非单词边界
\0 查找 NUL字符
\n 查找换行符
\f 查找换页符
\r 查找回车符
\t 查找制表符
\v 查找垂直制表符
\xxx 查找以八进制数 xxxx 规定的字符
\xdd 查找以十六进制数 dd 规定的字符
\uxxxx 查找以十六进制 xxxx规定的 Unicode 字符


表示字符的方法有多种,除了可以直接使用字符本身外,还可以使用 ASCII 编码或者 Unicode 编码来表示。

描述字符范围

在正则表达式语法中,放括号表示字符范围。在方括号中可以包含多个字符,表示匹配其中任意一个字符。如果多个字符的编码顺序是连续的,可以仅指定开头和结尾字符,省略中间字符,仅使用连字符~表示。如果在方括号内添加脱字符^前缀,还可以表示范围之外的字符。例如:

  • [abc]:查找方括号内任意一个字符。
  • [^abc]:查找不在方括号内的字符。
  • [0-9]:查找从 0 至 9 范围内的数字,即查找数字。
  • [a-z]:查找从小写 a 到小写 z 范围内的字符,即查找小写字母。
  • [A-Z]:查找从大写 A 到大写 Z 范围内的字符,即查找大写字母。
  • [A-z]:查找从大写 A 到小写 z 范围内的字符,即所有大小写的字母。

量词:

量词 描述
n+ 匹配任何包含至少一个 n 的字符串。
n* 匹配任何包含零个或多个 n 的字符串。
n? 匹配任何包含零个或一个 n 的字符串。

2.使用正则表达式对象RegExp

定义正则表达式

定义正则表达式的方法有两种:构造正则表达式和正则表达式(字面量)。
1.使用RegExp构造函数可以定义正则表达式对象。其语法格式如下:
newRegExp(pattern,atributes)
参数pattern是一个字符串,指定匹配模式或者正则表达式对象;参数attributes是一个可选的修饰性标志,包含”g””i””m”,分别设置全局匹配,区分大小写的匹配,和多行匹配。如果参数pattern是正则表达式对象,则省略该参数。该参数将返回一个新的RegExp对象,对象包含指定的匹配模式和匹配标志。
2.正则表达式直接量使用双斜杠作为分隔符进行定义,双斜杠之间包含的字符为正则表达式的字符模式,字符模式不能使用引号,标志字符放在最后一个斜杠的后面。其语法格式如下:
/pattern/attributes
实例设计

  1. //示例1,下面的示例使用RegExp构造函数定义了一个简单的正则表达式。
  2. //匹配模式为字符“a”,没有设置第二个参数,所以这个正则表达式只能够匹配字符串中的第一个小写字母a.后面的字母a将无法匹配到。
  3. var r = new RegExp("a"); //构造最简单的正则表达式
  4. var s = "JavaScript!=JAVA"; //定义字符串直接量
  5. var a = s.match(r); //调用正则表达式执行匹配操作,返回匹配的数组
  6. console.log(a); //返回数组["a"]
  7. console.log(a.index); //返回值为1,匹配的下标位置

图片.png使用不同模式和标记可以创建各种正则表达式,比如

  1. let pattern1=/at/g;//匹配字符串中的所有“at”
  2. let pattern2=/.at/i;//匹配所有以“at”结尾的三字符组合,忽略大小写
  3. let pattern3=/[bc]at/i;//匹配第一个“bat”“cat”,忽略大小写

JavaScript正则表达式支持”g””i””m”3个标志修饰符,简单说明如下。
“g” global(全局)的缩写,定义全局匹配,即正则表达式将在指定字符串范围内执行所有匹
配,而不是找到第1个匹配结果后就停止匹配。
“i”:case -insensitive-大小写不敏感)中 insensitive的缩写,定义不区分大小写匹配,即对于字
母的大小写视为等同。
m”: multiline(多行)的缩写,定义多行字符串匹配。
这3个修饰词分别指定了匹配操作的范围、大小写和多行行为,关键词可以自由组合。


元字符的转义

与其他语言的正则表达式一样,所有的元字符在模式中也必须转义,包括:
{ [ ( \ ^ $ | ? * + .
元字符在正则表达式中都有一种或多种特殊功能,所以要匹配上面的字符本身,就必须使用反斜杠来转义。下面是几个例子:

  1. let s = "There is a bat and cat, 'batand.atcat[bc]at'"
  2. let pattern1 = /[bc]at/i; //匹配第一个“bat”或者“cat”,忽略大小写
  3. let pattern2 = /\[bc\]at/i; //匹配第一个“[bc]at".忽略大小写
  4. let pattern3 = /.at/gi; //匹配第一个以“at”结尾的三字符组合,忽略大小写
  5. let pattern4 = /\.at/gi; //匹配第一个“.at”,忽略大小写
  6. let a = pattern1.exec(s);
  7. let b = s.match(pattern2);
  8. const c = pattern3.exec(s);
  9. let d = pattern4.exec(s);
  10. console.log(a);
  11. console.log(b);
  12. console.log(c);
  13. console.log(d);

图片.png
这里的 pattern1匹配”bat”或”cat”,不区分大小写。要直接匹配[bc]at,左右中括号都必须像 pattern2中那样使用反斜杠转义。在 pattern3中,点号表示”at”前面的任意字符都可以匹配,如果想匹配at,那么要像 pattern4中那样对点号进行转义。


前面例子中的正则表达式都是使用字面量形式定义的。正则表达式也可以使用 RegExp构造函数来
创建,它接收两个参数:模式字符串和(可选的)标记字符串。任何使用字面量定义的正则表达式也可
以通过构造函数来创建,比如:
匹配第一个”bat”或”cat”,忽略大小写
let pattern1 =/[bc]at/i;
/跟 patternl1一样,只不过是用构造函数创建的
let pattern2 new RegExp('[bc]at','i');
这里的 pattern1和 pattern2是等效的正则表达式。注意, RegExp构造函数的两个参数都是字符串。因为 RegExp的模式参数是字符串,所以在某些情况下需要二次转义。所有元字符都必须二次转义,包括转义字符序列,如\n(\转义后的字符串是\,在正则表达式字符串中则要写成\\)下表展示了几个正则表达式的字面量形式,以及使用 RegExp构造函数创建时对应的模式字符串。

字面量模式 对应的字符串
/\[bc]at/ “\\[bc\\]at”
/\.at/ “\. at”
/name\/age/ “name\ \/age”
/\d.\d(1,2}/ “\\d.\\d(1,2}”
/\w\\hello\\123/ “\\w\\\\hello\\\\123”

编译正则表达式

实例设计

  1. var s = "JavaScript";
  2. var r = /\w/g;
  3. while (r.test(s)) {
  4. if (r.lastIndex == 3) {
  5. r.compile(/[A-Z]/g);
  6. r.lastIndex = 3;
  7. }
  8. console.log('匹配模式是' + r + ' 匹配文本是' + RegExp.lastMatch + ' r.lastIndex= ' + r.lastIndex);
  9. }

图片.png

RexExp静态属性

实例设计:

  1. var s = "JavaScript css html";
  2. var r = /(Java)Script/g;
  3. var n = r.exec(s);
  4. console.log(RegExp.input);
  5. console.log(RegExp.$_);
  6. console.log(RegExp.lastParen);
  7. console.log(RegExp.rightContext);

图片.png
补充