JS - RegExp 笔记
var str = "L.Rain";
str = str.replace(/[R|n]/g , "*"); <==> new RegExp("[R|n]","gi")
RegExp 类。RegExp对象的构造函数可以带一个或两个参数.第一个参数是描述需要进行匹配的模式字符串;如果有第二个参数,这个参数则指定了额外的处理指令.
最基本的正则表达式就是普通的字符串.
var reCat = new RegExp("cat"); <==> var reCat = /cat/;
var reCat = new RegExp("cat","g"); 第二个参数表示要搜索字符串出现的全部的"cat",而不是找到第一个匹配后就停止。如果还要模式不区分大小写
,可以给第二个参数添加字符 i var reCat = new RegExp("cat","gi"); <==> var reCat = /cat/gi;
测试: var sToMatch = "cat";
var reCat = /cat/gi;
alert( reCat.test(sToMatch) );
exec():访问模式的每一次出现
var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
var reAt = /at/;
var arrMatches = reAt.exec(sToMatch);
alert( arrMatches.length ); // output 1
match(): String 对象的 match() 方法
var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
var reAt = /at/gi;
var arrMatches = sToMatch.match(reAt);
alert( arrMatches.length ); // output 6
search() : 此方法与 indexOf()方法类似,但是它使用的是一个 RegExp 对象 而并非一个字符串 ,返回的是字符串中一个匹配的位置。(g)全局匹配在此
方法不起作用。
replace():可以用另外一个字符串(第二个参数) 来代替某一个字符串 或者 一个匹配的模式字符串 (第一个参数) 的所有匹配
split(): 参数 可以为一个字符串 也可以为 一个 匹配的模式字符串 RegExp 对象
/****************************/
元字符,字符类和量词等都是正则表达式语法中非常重要的部分。
元字符: ( [ { \ ^ $ | ) ? * + 任何时候要使用这些元字符 ,都必须对它们进行转义。因此
var reQMark =/\?/ ;
<==>
var reQMark = new RegExp("\\?"); 注意此处为 \\ Javascript高级程序设计 P170
使用特殊字符: \t \n (换行符) \r (回车符) \f \a \e \cX \b \v \0 (空字符)
var sNewString = sStringnewlines.replace(/\n/g,"")
如果通过 RegExp 构造函数来使用它们 , 则都必须进行双重转义.
字符类: 简单类 : 是用于测试的字符的组合.通过将一些字符放入括号中。 例如要匹配字符a,b,c应该为[abc], 这个称之为简单类。
var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
var reBatCatRat =/[bcf]at/gi;
var arrMatches = sToMatch.match(reBatCatRat);
document.write(arrMatches); //bat,Cat,fAt,baT,faT,cat
负向类 : 除了特定的一些,你可能会要匹配所有的字符, 则可以使用负向类。 例如要匹配除了a和b的所有字符,那么应该为[^ab]
var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
var reBatCatRat =/[^bc]at/gi;
var arrMatches = sToMatch.match(reBatCatRat);
document.write(arrMatches); //fAt,faT
范围类 : 要匹配所有的字母表中的字符,但是又实在不想逐个输入。 例如指定从a到z之间范围:[a-z]。那条横线可看作为"从什么到什么"
组合类 : 是由几种其他的类组合而成的字符类.例如 假设要匹配所有的从a~m的字母以及从1~4的数字,以及以个换行符。
[a-m1-4\n] 注意 不要有空格。
在 ECMAScript 不支持联合类和交叉类 如:[a-m[p-z] [a-m[^b-e]]之间的模式出现
预定义类 : . <=> [^\n\r] 除了换行符和回车之外的任意字符
\d <=> [0-9] 任意数字
\D <=> [^0-9] 非数字字符
\s <=> [\t\n\x0B\f\r] 空白字符
\S <=> [^\t\n\x0B\f\r] 非空白字符
\w <=> [a-zA-Z_0-9] 单词字符(所有的字母,数字,下划线)
\W <=> [^a-zA-Z_0-9] 非单词字符
量词 : 可以指定某个特定模式出现的次数
? 出现0或1次
* 出现0或多次
+ 出现1次或多次 最少一次
{n} 一定出现n次
{n,m} 至少出现 n 次 但不超过 m次
{n,} 至少出现 n 次
复杂模式
分组:
var reg = /[.]*?play-(.*?)\.html$/;
var str = "http://www.openv.com/zj/zj_play-sport_2008_2017.html";
reg.test(str);
document.write(RegExp.$1); //output sport_2008_2017
贪婪、惰性 和 支配性 (目前IE.Opera不支持)的量词 ☆
贪婪量词: 先看整个的字符串是否匹配.如果没有发现匹配的,它去掉该字符串的最后一个字符,并再次尝试。如果还没有发现匹配,那么再次去掉最后一个字符
这个过程一直重复直到发现一个匹配或者字符串不剩任何字符。
惰性量词: 先看字符串的第一个字母是否匹配。如果单独这一个字符还不够,就读入下一个字符, 组成两个字符的字符串.如果还没有匹配,惰性量词将继续从
字符串中添加字符直到发现匹配或整个字符串都检查过也没有匹配。刚好与贪婪量词相反。
支配量词:只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步的尝试。支配量词就是一刀切,
贪婪: ? * +
惰性: ?? *? +?
支配: ?+ *+ ++
str = str.replace(/[R|n]/g , "*"); <==> new RegExp("[R|n]","gi")
RegExp 类。RegExp对象的构造函数可以带一个或两个参数.第一个参数是描述需要进行匹配的模式字符串;如果有第二个参数,这个参数则指定了额外的处理指令.
最基本的正则表达式就是普通的字符串.
var reCat = new RegExp("cat"); <==> var reCat = /cat/;
var reCat = new RegExp("cat","g"); 第二个参数表示要搜索字符串出现的全部的"cat",而不是找到第一个匹配后就停止。如果还要模式不区分大小写
,可以给第二个参数添加字符 i var reCat = new RegExp("cat","gi"); <==> var reCat = /cat/gi;
测试: var sToMatch = "cat";
var reCat = /cat/gi;
alert( reCat.test(sToMatch) );
exec():访问模式的每一次出现
var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
var reAt = /at/;
var arrMatches = reAt.exec(sToMatch);
alert( arrMatches.length ); // output 1
match(): String 对象的 match() 方法
var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
var reAt = /at/gi;
var arrMatches = sToMatch.match(reAt);
alert( arrMatches.length ); // output 6
search() : 此方法与 indexOf()方法类似,但是它使用的是一个 RegExp 对象 而并非一个字符串 ,返回的是字符串中一个匹配的位置。(g)全局匹配在此
方法不起作用。
replace():可以用另外一个字符串(第二个参数) 来代替某一个字符串 或者 一个匹配的模式字符串 (第一个参数) 的所有匹配
split(): 参数 可以为一个字符串 也可以为 一个 匹配的模式字符串 RegExp 对象
/****************************/
元字符,字符类和量词等都是正则表达式语法中非常重要的部分。
元字符: ( [ { \ ^ $ | ) ? * + 任何时候要使用这些元字符 ,都必须对它们进行转义。因此
var reQMark =/\?/ ;
<==>
var reQMark = new RegExp("\\?"); 注意此处为 \\ Javascript高级程序设计 P170
使用特殊字符: \t \n (换行符) \r (回车符) \f \a \e \cX \b \v \0 (空字符)
var sNewString = sStringnewlines.replace(/\n/g,"")
如果通过 RegExp 构造函数来使用它们 , 则都必须进行双重转义.
字符类: 简单类 : 是用于测试的字符的组合.通过将一些字符放入括号中。 例如要匹配字符a,b,c应该为[abc], 这个称之为简单类。
var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
var reBatCatRat =/[bcf]at/gi;
var arrMatches = sToMatch.match(reBatCatRat);
document.write(arrMatches); //bat,Cat,fAt,baT,faT,cat
负向类 : 除了特定的一些,你可能会要匹配所有的字符, 则可以使用负向类。 例如要匹配除了a和b的所有字符,那么应该为[^ab]
var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
var reBatCatRat =/[^bc]at/gi;
var arrMatches = sToMatch.match(reBatCatRat);
document.write(arrMatches); //fAt,faT
范围类 : 要匹配所有的字母表中的字符,但是又实在不想逐个输入。 例如指定从a到z之间范围:[a-z]。那条横线可看作为"从什么到什么"
组合类 : 是由几种其他的类组合而成的字符类.例如 假设要匹配所有的从a~m的字母以及从1~4的数字,以及以个换行符。
[a-m1-4\n] 注意 不要有空格。
在 ECMAScript 不支持联合类和交叉类 如:[a-m[p-z] [a-m[^b-e]]之间的模式出现
预定义类 : . <=> [^\n\r] 除了换行符和回车之外的任意字符
\d <=> [0-9] 任意数字
\D <=> [^0-9] 非数字字符
\s <=> [\t\n\x0B\f\r] 空白字符
\S <=> [^\t\n\x0B\f\r] 非空白字符
\w <=> [a-zA-Z_0-9] 单词字符(所有的字母,数字,下划线)
\W <=> [^a-zA-Z_0-9] 非单词字符
量词 : 可以指定某个特定模式出现的次数
? 出现0或1次
* 出现0或多次
+ 出现1次或多次 最少一次
{n} 一定出现n次
{n,m} 至少出现 n 次 但不超过 m次
{n,} 至少出现 n 次
复杂模式
分组:
var reg = /[.]*?play-(.*?)\.html$/;
var str = "http://www.openv.com/zj/zj_play-sport_2008_2017.html";
reg.test(str);
document.write(RegExp.$1); //output sport_2008_2017
贪婪、惰性 和 支配性 (目前IE.Opera不支持)的量词 ☆
贪婪量词: 先看整个的字符串是否匹配.如果没有发现匹配的,它去掉该字符串的最后一个字符,并再次尝试。如果还没有发现匹配,那么再次去掉最后一个字符
这个过程一直重复直到发现一个匹配或者字符串不剩任何字符。
惰性量词: 先看字符串的第一个字母是否匹配。如果单独这一个字符还不够,就读入下一个字符, 组成两个字符的字符串.如果还没有匹配,惰性量词将继续从
字符串中添加字符直到发现匹配或整个字符串都检查过也没有匹配。刚好与贪婪量词相反。
支配量词:只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步的尝试。支配量词就是一刀切,
贪婪: ? * +
惰性: ?? *? +?
支配: ?+ *+ ++