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. Directed Roads CodeForces - 711D (基环外向树 )

    ZS the Coder and Chris the Baboon has explored Udayland for quite some time. They realize that it co ...

  2. Codeforces 976 正方格蛇形走位 二维偏序包含区间 度数图构造 贪心心火牧最大dmg

    A #include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; int main() { i ...

  3. zlib的压缩与解压

    http://zlibnet.codeplex.com/releases/view/629717 using ZLibNet; string str = "ccc"; byte [ ...

  4. 清北学堂提高组突破营游记day6

    还有一天就结束了..QWQ 好快啊. 昨天没讲完的博弈论DP: 一个标准的博弈论dp,一般问的是是否先手赢. 博弈论最关键的问题:dp过程. 对于一个问题,一定有很多状态,每个状态可以转移到其他的一些 ...

  5. 移动web开发问题和经验总结

    前言 这里大部分是自己遇到过的情况,还有一部分借鉴了同行的文章,如果大家有遇到其它坑,欢迎提出来一起研究. 知识要点 1. Meta标签 1.禁止用户缩放页面,页面强制让文档的宽度与设备的宽度保持1: ...

  6. chrome获取页面element的xPath

    chrome真的是强大的工具 1.在chrome打开的页面点击F12,进入开发者模式 2.点击弹出的开发者工具左上角的跟踪箭头,再点击需要跟踪的页面元素,html程序定位到元素在程序中位置 3.选中的 ...

  7. 【新手】【十分钟上手系列-一】快速开发vue插件

    2018.6.28 在这浮躁的前端娱乐圈,不会三两个新框架都觉得自己不是前端.哦,不是我说的.说到底.原生才是重中之重.加油. vue用了大半年多,一直在用ui库,插件等,没有自己的东西. 想想连个v ...

  8. MySQL事务以及特征

    1.什么是事务? 在现实生活中,我们往往会进行转账操作.转账可以分为两部分完成,转入和转出,只要两部分都完成了才算转账完成.在数据库中,这个过程是由两条sql语句来完成的, 如果任意一方的语句没有执行 ...

  9. python 脚本制作

    U盘拷贝 当U盘插入主机时 被系统识别挂载后 通过python代码自动的去读取U盘中的资料并且进行拷贝 寄存在U盘上的 把硬盘上的资料进行读取并移动到U盘里 有点像 繁殖性 传输性 破坏性 破坏系统或 ...

  10. oracle基本语句(第五章、数据库逻辑存储结构管理)

    1.使用SYS用户以SYSDBA身份登录到SQL Plus,使用视图V$TABLESPACE查看表空间信息 SELECT * FROM V$TABLESPACE; 2.查看视图DBA_TABLESPA ...