(书籍上更详细)
RegExp 对象
RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。
直接量语法
/pattern/attributes
创建 RegExp 对象的语法:
new RegExp(pattern, attributes);
参数
参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。
参数 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。
返回值
一个新的 RegExp 对象,具有指定的模式和标志。如果参数 pattern 是正则表达式而不是字符串,那么 RegExp() 构造函数将用与指定的 RegExp 相同的模式和标志创建一个新的 RegExp 对象。
如果不用 new 运算符,而将 RegExp() 作为函数调用,那么它的行为与用 new 运算符调用时一样,只是当 pattern 是正则表达式时,它只返回 pattern,而不再创建一个新的 RegExp 对象。
抛出
SyntaxError - 如果 pattern 不是合法的正则表达式,或 attributes 含有 "g"、"i" 和 "m" 之外的字符,抛出该异常。
TypeError - 如果 pattern 是 RegExp 对象,但没有省略 attributes 参数,抛出该异常。
方括号
方括号用于查找某个范围内的字符:
| 表达式 | 描述 |
|---|---|
| [abc] | 查找方括号之间的任何字符。 |
| [^abc] | 查找任何不在方括号之间的字符。 |
| [0-9] | 查找任何从 0 至 9 的数字。 |
| [a-z] | 查找任何从小写 a 到小写 z 的字符。 |
| [A-Z] | 查找任何从大写 A 到大写 Z 的字符。 |
| [A-z] | 查找任何从大写 A 到小写 z 的字符。 |
| [adgk] | 查找给定集合内的任何字符。 |
| [^adgk] | 查找给定集合外的任何字符。 |
| (red|blue|green) | 查找任何指定的选项。 |
元字符
元字符(Metacharacter)是拥有特殊含义的字符:
| 元字符 | 描述 |
|---|---|
| . | 查找单个字符,除了换行和行结束符。 |
| \w | 查找单词字符。 |
| \W | 查找非单词字符。 |
| \d | 查找数字。 |
| \D | 查找非数字字符。 |
| \s | 查找空白字符。 |
| \S | 查找非空白字符。 |
| \b | 匹配单词边界。 |
| \B | 匹配非单词边界。 |
| \0 | 查找 NUL 字符。 |
| \n | 查找换行符。 |
| \f | 查找换页符。 |
| \r | 查找回车符。 |
| \t | 查找制表符。 |
| \v | 查找垂直制表符。 |
| \xxx | 查找以八进制数 xxx 规定的字符。 |
| \xdd | 查找以十六进制数 dd 规定的字符。 |
| \uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符。 |
量词
| 量词 | 描述 |
|---|---|
| n+ | 匹配任何包含至少一个 n 的字符串。 |
| n* | 匹配任何包含零个或多个 n 的字符串。 |
| n? | 匹配任何包含零个或一个 n 的字符串。 |
| n{X} | 匹配包含 X 个 n 的序列的字符串。 |
| n{X,Y} | 匹配包含 X 或 Y 个 n 的序列的字符串。 |
| n{X,} | 匹配包含至少 X 个 n 的序列的字符串。 |
| n$ | 匹配任何结尾为 n 的字符串。 |
| ^n | 匹配任何开头为 n 的字符串。 |
| ?=n | 匹配任何其后紧接指定字符串 n 的字符串。 |
| ?!n | 匹配任何其后没有紧接指定字符串 n 的字符串。 |
RegExp 对象属性
| 属性 | 描述 | FF | IE |
|---|---|---|---|
| global | RegExp 对象是否具有标志 g。 | 1 | 4 |
| ignoreCase | RegExp 对象是否具有标志 i。 | 1 | 4 |
| lastIndex | 一个整数,标示开始下一次匹配的字符位置。 | 1 | 4 |
| multiline | RegExp 对象是否具有标志 m。 | 1 | 4 |
| source | 正则表达式的源文本。 | 1 | 4 |
RegExp 对象方法
| 方法 | 描述 | FF | IE |
|---|---|---|---|
| compile | 编译正则表达式。 | 1 | 4 |
| exec | 检索字符串中指定的值。返回找到的值,并确定其位置。 | 1 | 4 |
| test | 检索字符串中指定的值。返回 true 或 false。 | 1 | 4 |
支持正则表达式的 String 对象的方法
| 方法 | 描述 | FF | IE |
|---|---|---|---|
| search | 检索与正则表达式相匹配的值。 | 1 | 4 |
| match | 找到一个或多个正则表达式的匹配。 | 1 | 4 |
| replace | 替换与正则表达式匹配的子串。 | 1 | 4 |
| split | 把字符串分割为字符串数组。 | 1 | 4 |
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不支持)的量词 ☆
贪婪量词: 先看整个的字符串是否匹配.如果没有发现匹配的,它去掉该字符串的最后一个字符,并再次尝试。如果还没有发现匹配,那么再次去掉最后一个字符
这个过程一直重复直到发现一个匹配或者字符串不剩任何字符。
惰性量词: 先看字符串的第一个字母是否匹配。如果单独这一个字符还不够,就读入下一个字符, 组成两个字符的字符串.如果还没有匹配,惰性量词将继续从
字符串中添加字符直到发现匹配或整个字符串都检查过也没有匹配。刚好与贪婪量词相反。
支配量词:只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步的尝试。支配量词就是一刀切,
贪婪: ? * +
惰性: ?? *? +?
支配: ?+ *+ ++
本文深入探讨了正则表达式的概念、语法、修饰符、方括号、元字符、量词等核心内容,并提供了实例说明如何在实际场景中应用正则表达式。
3641

被折叠的 条评论
为什么被折叠?



