1、概述

正则表达式是描述字符模式的对象。

正则表达式用于对字符串模式匹配以及检索替换;

2、语法

前者为模式,后者为修饰符。

var reg = new RegExp( "xyz", "i" );
//等价于
var reg = /xyz/i;

注意:当使用构造函数创建正则对象的时候,需要在元字符前面加反斜杠(\)

var reg = new RegExp("\\w+");
//等价于
var reg = /\w+/;

3、修饰符

i ---- 不区分大小写
g ---- 全局匹配
m --- 多行匹配

m修饰符的作用:修改^和$在正则表达式中的作用,让它们分别表示行首和行尾。

        在默认状态下,一个字符串无论是否换行只有一个开始^和结尾$,如果采用多行匹配,那么每一个行都有一个^和结尾$。

var str="This is an\n antzone good";
var reg=/an$/;
console.log(str.match(reg)); // false 没有采用多行匹配,an不是字符串行的行尾。
var str="This is an\n antzone good";
var reg=/an$/m;
console.log(str.match(reg)); // true

4、方括号

方括号用于查找某个范围内的字符。

[0-9]    查找从0到9的任意数字
[a-z]    查找从a到z的任意字符
[A-Z]    查找从A到Z的任意字符
[A-z]    查找从A到z的任意字符
[adgk]   查找给定集合内的任意字符
[^adgk] 查找非给定集合内任意字符
( red | blue | green ) 查找任意指定的选项

5、元字符

拥有特殊含义的字符

.          任意单个字符(除换行符以外)
\w 单词字符
\W 非单词字符
\d 数字字符
\D 非数字字符
\s 空白字符
\S 非空白字符
\n 换行
\r 回车

6、量词

n+                匹配任何包含至少一个 n 的字符串 
              --- 例如,/a+/ 匹配 "candy" 中的 "a","caaaaaaandy" 中所有的 "a"。
n* 匹配任何包含零个或多个 n 的字符串
              --- 例如,/bo*/ 匹配 "A ghost booooed" 中的 "boooo","A bird warbled" 中的 "b",但是不匹配 "A goat grunted"。
n? 匹配任何包含零个或一个 n 的字符串
              --- 例如,/e?le?/ 匹配 "angel" 中的 "el","angle" 中的 "le"。
n{x} 匹配包含 X 个 n 的序列的字符串
              --- 例如,/a{2}/ 不匹配 "candy," 中的 "a",但是匹配 "caandy," 中的两个 "a",且匹配 "caaandy." 中的前两个 "a"
n{x,}        X 是一个正整数。前面的模式 n 连续出现至少 X 次时匹配。
              -- 例如,/a{2,}/ 不匹配 "candy" 中的 "a",但是匹配 "caandy" 和 "caaaaaaandy." 中所有的 "a"。
n{x,y}        X 和 Y 为正整数。前面的模式 n 连续出现至少 X 次,至多 Y 次时匹配。
              --- 例如,/a{1,3}/ 不匹配 "cndy";匹配 "candy," 中的 "a";"caandy," 中的两个 "a";匹配 "caaaaaaandy" 中的前面三个 "a"。
                 注意,当匹配 "caaaaaaandy" 时,即使原始字符串拥有更多的 "a",匹配项也是 "aaa"。
n$        匹配任何结尾为 n 的字符串。
^n         匹配任何结尾为 n 的字符串。
?=n         匹配任何其后紧跟指定字符串n的字符串
?!n         匹配任何其后没有紧跟指定字符串n的字符串

7、RegExp 对象的方法

(1)compile方法  --  【str.compile(pattern)】

compile() 方法用于在脚本执行过程中编译正则表达式。也可用于改变和重新编译正则表达式。

//在字符串中全局搜索 "man",并用 "person" 替换。然后通过 compile() 方法,改变正则表达式,用 "person" 替换 "man" 或 "woman",
<script> var str="Every man in the world! Every woman on earth!";
var patt=/man/g;
var str2=str.replace(patt,"person");
document.write(str2+"<br>");  //Every person in the world! Every woperson on earth!
patt=/(wo)?man/g;
patt.compile(patt);
str2=str.replace(patt,"person");
document.write(str2);      //Every person in the world! Every person on earth! </script>

(2)exec方法  --  【pattern.exec(str)】

exec() 方法用于检索字符串中的正则表达式的匹配。如果字符串中有匹配的值则返回该值,否则就返回null。

var str="Hello world!";
//查找"Hello"
var patt=/Hello/g;
var result = patt.exec(str);
document.write("返回值: " + result);    // 返回值:Hello
//查找 "RUNOOB"
patt=/RUNOOB/g;
result=patt.exec(str);
document.write("<br>返回值: " + result); //返回值: null

(3)test方法  --  【pattern.test(str)】

test() 方法用于检测一个字符串是否匹配某个模式。如果字符串有匹配的值返回true,否则返回false。

var str="Hello world!";
//查找"Hello"
var patt=/Hello/g;
var result=patt.test(str);
document.write("返回值: " + result);     //返回值:true
//查找 "Runoob"
patt=/Runoob/g;
result=patt.test(str);
document.write("<br>返回值: " + result);  //返回值false

8、string对象中 可用于正则表达式的方法。

(1)search方法

search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。若没有找到任何匹配的子串,返回-1。

//对大小写敏感的检索
var str="Mr. Blue has a blue house";
document.write(str.search("blue"));  // 15
//忽略大小写的检索
var str="Mr. Blue has a blue house";
document.write(str.search(/blue/i)); //4

(2)match方法

match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

若regexp没有标志g,则match方法就只能在字符串中执行一次;否则就会执行多次。若没有找到任何匹配文本,返回null;否则返回一个存放了匹配文本信息的数组。

var str="The rain in SPAIN stays mainly in the plain";
var n=str.match(/ain/gi);    //["ain", "AIN", "ain", "ain"]

(3)replace方法

replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

var str="Mr Blue has a blue house and a blue car";
var n=str.replace(/blue/gi, "red");    
console.log(str);   // Mr red has a red house and a red car

(4)split方法

split() 方法用于把一个字符串分割成字符串数组。

注意:split 方法不会改变原始字符串。

var str="How are you doing today?";
var n=str.split();    //["How are you doing today?"]
var str="How are you doing today?";
var n=str.split();   //["H", "o", "w", " ", "a", "r", "e", " ", "y", "o", "u", " ", "d", "o", "i", "n", "g", " ", "t", "o", "d", "a", "y", "?"]
var str="How are you doing today?";
var n=str.split(" ",3);  //["How", "are", "you"]

9、正则的一些 demo

(1)匹配编号为任意位数的章节标题:

/Chapter [1-9][0-9]*/    // 第二个位置 或 后面的位置 不一定需要有一个数字。

(2)若章节编号被限制为最多只有 99 章:

/Chapter [0-9]{1,2}/    // 缺陷: 0也会被匹配

// 改进
/Chapter [1-9][0-9]?/  或者    /Chapter [1-9][0-9]{0,1}/

(3)*、+ 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。

<H1>Chapter 1 - 介绍正则表达式</H1>
贪婪:下面的表达式匹配从开始小于符号 (<) 到关闭 H1 标记的大于符号 (>) 之间的所有内容。
/<.*>/ 非贪婪:如果您只需要匹配开始和结束 H1 标签,下面的非贪婪表达式只匹配 <H1>。
/<.*?>/ 如果只想匹配开始的 H1 标签,表达式则是:
/<\w+?>/

(4)反向引用的例子

对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。

缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用  \n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。

可以使用非捕获元字符 ?:、?= 或 ?! 来重写捕获,忽略对相关匹配的保存。

反向引用的最简单的、最有用的应用之一,是提供查找文本中两个相同的相邻单词的匹配项的能力。以下面的句子为例:

var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/ig;
document.write(str.match(patt1));

捕获的表达式,正如 [a-z]+ 指定的,包括一个或多个字母。正则表达式的第二部分是对以前捕获的子匹配项的引用,即,单词的第二个匹配项正好由括号表达式匹配。\1 指定第一个子匹配项。

字边界元字符确保只检测整个单词。否则,诸如 "is issued" 或 "this is" 之类的词组将不能正确地被此表达式识别。

正则表达式后面的全局标记 g 指定将该表达式应用到输入字符串中能够查找到的尽可能多的匹配。

表达式的结尾处的不区分大小写 i 标记指定不区分大小写。

反向引用还可以将通用资源指示符 (URI) 分解为 协议、域名、端口 和 路径:

var str = "http://www.runoob.com:80/html/html-tutorial.html";
var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/;    // 中括号[] 里面的^ 表示的是“非”的意思
arr = str.match(patt1);
for (var i = 0; i < arr.length ; i++) {
document.write(arr[i]);
document.write("<br>");
}

第一个括号子表达式捕获 Web 地址的协议部分。该子表达式匹配在冒号和两个正斜杠前面的任何单词。 —— "http"

第二个括号子表达式捕获地址的域名部分。子表达式匹配 : 和 / 之后的一个或多个字符。—— "www.runoob.com"

第三个括号子表达式捕获端口号(如果指定了的话)。该子表达式匹配冒号后面的零个或多个数字。只能重复一次该子表达式。—— ":80"

第四个括号子表达式捕获 Web 地址指定的路径和 / 或页信息。该子表达式能匹配不包括 # 或空格字符的任何字符序列。—— "/html/html-tutorial.html"

JavaScript对象之--- RegExp的更多相关文章

  1. 关于javascript对象的简单记忆法

    关于javascript对象方法的简单记忆法(个人整理) string对象: 大号小号闪烁加链接./big/small/blink/link/ 粗体斜体打字删除线./bold/italics/fixe ...

  2. 第六章:Javascript对象

    对象是javascript的基本数据类型.对象是一种复合值.它将很多值(原始值 或者其他对象)聚合在一起.可通过名字访问这些值.对象也可以看做是属性的无序集合,每个属性都有一个名/值.属性名是字符串, ...

  3. JavaScript对象进阶

    要了解JavaScript对象,我们可以从对象创建.属性操作.对象方法这几个方面入手.概括起来,包括以下几模块: 1.创建对象 1.1 对象直接量 对象直接量是创建对象最简单的方式,由若干名/值对组成 ...

  4. 15条规则解析JavaScript对象布局(__proto__、prototype、constructor)

    大家都说JavaScript的属性多,记不过来,各种结构复杂不易了解.确实JS是一门入门快提高难的语言,但是也有其他办法可以辅助记忆.下面就来讨论一下JS的一大难点-对象布局,究竟设计JS这门语言的人 ...

  5. JavaScript对象 + Browser 对象 + HTML DOM 对象

    JavaScript 对象 Array Boolean Date Math Number String RegExp Global Browser 对象 Window Navigator Screen ...

  6. 深入学习JavaScript对象

    JavaScript中,除了五种原始类型(即数字,字符串,布尔值,null,undefined)之外的都是对象了,所以,不把对象学明白怎么继续往下学习呢? 一.概述 对象是一种复合值,它将很多值(原始 ...

  7. 深入浅出 JavaScript 对象 v0.5

    JavaScript 没有类的概念,因此它的对象与基于类的语言中的对象有所不同.笔者主要参考<JS 高级程序设计>.<JS 权威指南>和<JS 精粹> 本文由浅入深 ...

  8. javascript--15条规则解析JavaScript对象布局(__proto__、prototype、constructor)

    大家都说JavaScript的属性多,记不过来,各种结构复杂不易了解.确实JS是一门入门快提高难的语言,但是也有其他办法可以辅助记忆.下面就来讨论一下JS的一大难点-对象布局,究竟设计JS这门语言的人 ...

  9. javaScript对象学习笔记(一)

    一.什么是对象 对象: JavaScript的一种基本数据类型 对象是属性的无序集合,每个属性都是一个名/值对 JavaScript中的事物都是对象:字符串.数值.数组.函数... JavaScrip ...

随机推荐

  1. AIX中物理卷管理

    1.物理卷管理   1.1物理卷区域的分布 按照磁头在硬盘上的读写速率不同可以把硬盘划分成几个不同级别的区域.因此逻辑卷对应的PP在哪一个级别的区域上,对逻辑卷的读写速率影响很大. 硬盘的截面分为5个 ...

  2. Linux中文件查找,压缩和打包指令

    1.文件的查找和搜索 可执行文件的搜索:which .whereis locate搜索文件 find搜索文件       1.1可执行文件的搜索       在Linux系统中,有成百上千个指令,不同 ...

  3. SpringMVC与Json数据交互

    简单回顾了一下SpringMVC和前端JSON数据是怎么交互的 接下来详细说一下过程 前端代码写的很简单  主要是为了试验一下JSON数据的前后台传递 前端代码给大家发出来 其实真的很简单 前端接受了 ...

  4. C#基础知识之理解HTTP协议

    在互联网时代HTTP协议的重要性无需多言,对于技术岗位的同学们来说理解掌握HTTP协议是必须的.本篇博客就从HTTP协议的演进.特性.重要知识点和工作中常见问题的总结等方面进行简单的介绍.理解掌握了这 ...

  5. Bootstarp-table入门(1)

    https://blog.csdn.net/dlf123321/article/details/52231926?locationNum=11&fps=1

  6. Windows10家庭版的功能中没有Hyper-V的解决方法

    1.在桌面新建记事本 将下面的内容复制到编辑器或者记事本当中 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper ...

  7. CodeForces-916A-jamie and Alarm Snooze(笨比题目)

    链接: https://vjudge.net/problem/CodeForces-916A 题意: Jamie loves sleeping. One day, he decides that he ...

  8. vue 父组件使用keep-alive和infinite-scroll导致在子组件触发父组件的infinite-scroll方法

    (vue.js)vue 父组件使用keep-alive和infinite-scroll导致在子组件触发父组件的infinite-scroll方法”问题疑问,本网通过在网上对“ (vue.js)vue ...

  9. 使用命令在navicat中创建数据库和用户

    一.用高权限账号登录,即创建连接 二.选择高权限用户右键,调出命令窗口 三.使用sql语句创建数据库 create database 数据库名 DEFAULT CHARACTER SET gbk CO ...

  10. Python---webserver项目

    # HTTP项目实战 - 深入理解HTTP协议 - 模拟后台服务程序基本流程和大致框架 - 每一个步骤一个文件夹 - 图解http协议,图解tcp/ip协议 # v01-验证技术 - 验证socket ...