JavaScript对象之--- RegExp
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"