JS-RegExp正则表达式的对象

来源:互联网 发布:感动一个人 知乎 编辑:程序博客网 时间:2024/05/17 03:52

RegExp 对象

RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。

直接量语法

/pattern/attributesvar str = "1232".replace(/[0-9]/g,5); // 5555

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 参数,抛出该异常。

指令(规则)

后缀指令(修饰符)

  • i 使匹配规则不分大小写
  • g 全局匹配
  • m 多行匹配,使换行符号变成上一行的结尾和下一行的开始
var str = "dggGGG";var reg = /g+/i;console.log(str.match(reg)); //ggGGG
var str = "dggGGG";var reg = /g/g;console.log(str.match(reg)); //gg
var str = "ggGGG\nG";var reg = /^g/mig;console.log(str.match(reg));//g G

方括号

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

  • [abc] 查找方括号之间的任何字符
var str = "abcd"var reg = /[abc]+/;console.log(str.match(reg)); // abc
  • [^abc] 查找任何不在方括号之间的字符
var str = "abcd"var reg = /[^abc]/;console.log(str.match(reg)); // d
  • [0-9] 查找任何从 0 至 9 的数字
var str = "abcd12"var reg = /[0-9]/;console.log(str.match(reg)); // 1
  • [a-z] 查找任何从 0 至 9 的数字
var str = "abcd12"var reg = /[a-z] /;console.log(str.match(reg)); // a
  • [A-Z] 查找任何从大写 a 到大写 z 的字符
var str = "abcd12"var reg = /[A-Z]/i;console.log(str.match(reg)); // a
  • [A-z] 查找任何从大写 a 到小写 z 的字符
var str = "abcd12"var reg = /[A-z]/;console.log(str.match(reg)); // a//相当于 unicode的65 - 122
  • [adgk] 查找给定集合内的任何字符
var str = "abcd12"var reg = /[adgk]/;console.log(str.match(reg)); // a
  • [^adgk] 查找给定集合外的任何字符
var str = "abcd12"var reg = /[^adgk]/;console.log(str.match(reg)); // b
  • (red|blue|green) 查找任何指定的选项
var str = "abcd12red"var reg = /(red|blue|green)/;console.log(str.match(reg)); // red

提示:[]内的只能单个查找不能多个查找,如:[red],只能查找r或者e或者d

如果要查找red,应该放在()内

元字符

是拥有特殊含义的字符

  • . 查找任何字符,除了换行和行结束符
var str = "abc"var reg = /.+/;console.log(str.match(reg)); // abc
  • \w 查找单词字符
var str = ".+(%~.'\"g"var reg = /\w+/;console.log(str.match(reg)); // g
  • \W 查找非单词字符
var str = ".+(%~.'\"g"var reg = /\W+/;console.log(str.match(reg)); // .+(%~.'"
  • \d 查找数字
var str = ".+(%~.'\"g123"var reg = /\d+/;console.log(str.match(reg)); // 123
  • \D 查找非数字字符
var str = ".+(%~.'\"g123"var reg = /\D+/;console.log(str.match(reg)); // .+(%~.'"g
  • \s 查找空白字符
var str = ".+(%~.' \"g123 "var reg = /\s/;console.log(reg.test(str)); // true
  • \S 查找非空白字符
var str = ".+(%~.' \"g123 "var reg = /\S/;console.log(str.match(reg)); // .
  • \b 匹配单词边界,相当于非字符但不包含匹配到的非字符
var str="Visit WVVVV";var reg=/\bV/g;console.log(str.match(reg)); // V
var str1="Visit W.V.V.V.V";var reg1=/\bV/g;console.log(str1.match(reg1)); // V V V V V
  • \B 匹配非单词边界
var str="Visit WVVVV";var reg=/\BV/g;console.log(str.match(reg)); // V V V V 除了第一个
  • \n 查找换行符
var str="12346\n";var reg=/\n/g;console.log(str.match(reg)); // ↵
  • \0 查找 NUL 字符
var str="Visit\0";var reg=/\0/g;console.log(reg.test(str)); // true
  • \f 查找换页符
var str="Visit\f";var reg=/\f/g;console.log(reg.test(str)); // true
  • \r 查找回车符
var str="Visit\r";var reg=/\r/g;console.log(reg.test(str)); // true
  • \t 查找制表符
var str="Visit\t";var reg=/\t/g;console.log(reg.test(str)); // true
  • \v 查找垂直制表符
var str="Visit\v";var reg=/\v/g;console.log(reg.test(str)); // true
  • \xxx 以八进制数 xxx 规定的字符
var str="Wisit";var reg=/\127/g;console.log(str.match(reg)); // W
  • \xdd 以十六进制数 dd 规定的字符
var str="Wisit";var reg=/\x57/g;console.log(str.match(reg)); // W
  • \uxxxx 以十六进制数 xxxx 规定的 Unicode 字符
var str="Wisit";var reg=/\u0057/g;console.log(str.match(reg)); // W

量词

  • n+ 匹配任何包含至少一个 n 的字符串
var str="aabbcc";var reg=/a+/;console.log(str.match(reg)); // aa
  • n* 匹配任何包含零个或多个 n 的字符串
var str="ccdddbccb";var reg=/ccd*b/g;console.log(str.match(reg)); // ccdddb ccb
  • n? 匹配任何包含零个或一个 n 的字符串
var str="ccdbccddb";var reg=/ccd*b/g;console.log(str.match(reg)); // ccdb
  • n{X} 匹配包含 X 个 n 的序列的字符串
var str="ccdc";var reg=/c{1}/g;console.log(str.match(reg)); // c c c 
  • n{X,y} 匹配包含 X 至 Y 个 n 的序列的字符串
var str="ccdc";var reg=/c{1,2}/g;console.log(str.match(reg)); // cc c 
  • n{X,} 匹配包含至少 X 个 n 的序列的字符串
var str="ccdcdddccccccccc";var reg=/c{1,}/g;console.log(str.match(reg)); // cc c ccccccccc
  • n$ 匹配任何结尾为 n 的字符串
var str="ccn";var reg=/n$/g;console.log(reg.test(str)); // true
  • ^n 匹配任何开头为 n 的字符串
var str="nccc";var reg=/^n/g;console.log(reg.test(str)); // true
  • ?=n 匹配任何其后紧接指定字符串 n 的字符串
var str="cndnfn";var reg=/\w(?=n)/g;console.log(str.match(reg)); // c d f
  • ?!n 匹配任何其后没有紧接指定字符串 n 的字符串
var str="cndnfnbcbdbj";var reg=/b(?!n)/g;console.log(str.match(reg)); // b b b

属性

1. global

用于返回正则表达式是否具有标志 “g”。它声明了给定的正则表达式是否执行全局匹配。如果 g 标志被设置,则该属性为 true,否则为 false。

RegExpObject.global

var str = "zsh is good boy";var reg = new RegExp("zsh");if(reg.global)  {  alert("Global property is set");  }else  {  alert("Global property is NOT set.");  }

2. ignoreCase

是否设置 “i” 标志。如果设置了 “i” 标志,则返回 true,否则返回 false。

RegExpObject.ignoreCase

var str = "zsh is good boy";var reg = new RegExp("zsh");if(reg.ignoreCase)  {  alert("ignoreCase property is set");  }else  {  alert("ignoreCase property is NOT set.");  }

3. lastIndex

规定下次匹配的起始位置

说明

该属性存放一个整数,它声明的是上一次匹配文本之后的第一个字符的位置。
上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本。
该属性是可读可写的。只要目标字符串的下一次搜索开始,就可以对它进行设置。当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0。

提示:不具有标志 g 和不表示全局模式的 RegExp 对象不能使用 lastIndex 属性。

提示:如果在成功地匹配了某个字符串之后就开始检索另一个新的字符串,需要手动地把这个属性设置为 0。

RegExpObject.lastIndex

var str = "The rain in Spain stays mainly in the plain";var patt1 = new RegExp("ain", "g");patt1.test(str)document.write("Match found. index now at: " + patt1.lastIndex);patt1.test(str)document.write("Match found. index now at: " + patt1.lastIndex);结果    Match found. index now at: 8    Match found. index now at: 17
var str = "The rain in Spain stays mainly in the plain";var patt1 = new RegExp("ain", "g");patt1.test(str)document.write("Match found. index now at: " + patt1.lastIndex);patt1.lastIndex = 20;patt1.test(str)document.write("Match found. index now at: " + patt1.lastIndex);结果    Match found. index now at: 8    Match found. index now at: 28

4. multiline

返回正则表达式是否具有标志 m。它声明了给定的正则表达式是否以多行模式执行模式匹配。在这种模式中,如果要检索的字符串中含有换行符,^ 和 /W3School/im 匹配 “w3school” 和 “W3School\nisgreat”。(\n 是换行符\u000A)。如果 m 标志被设置,则该属性为 true,否则为 false。

RegExpObject.multiline

var str = "zsh is good boy";var reg = new RegExp("zsh");if(reg.multiline)  {  alert("multiline property is set");  }else  {  alert("multiline property is NOT set.");  }

5. source

返回模式匹配所用的文本。该文本不包括正则表达式直接量使用的定界符,也不包括标志 g、i、m。

RegExpObject.source

var str = "zsh is good boy";var reg = new RegExp("zsh");document.write("The regular expression is: " + patt1.source); // zsh

方法

1. compile

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

RegExpObject.compile(regexp,modifier)

参数

  • 必需
    • regexp 正则表达式。
    • modifier 规定匹配的类型。”g” 用于全局匹配,”i” 用于区分大小写,”gi” 用于全局区分大小写的匹配。

在字符串中全局搜索 “man”,并用 “person” 替换。然后通过 compile() 方法,改变正则表达式,用 “person” 替换 “man” 或 “woman”

var str="Every man in the world! Every woman on earth!";reg=/man/g;str2=str.replace(reg,"person");document.write(str2+"<br />");reg=/(wo)?man/g;reg.compile(reg);str2=str.replace(reg,"person");document.write(str2);
  1. exec
    用于检索字符串中的正则表达式的匹配

返回值

返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

说明

exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法以及支持正则表达式的 String 对象的方法更为复杂。如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。

但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。

提示:如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0。

提示:请注意,无论 RegExpObject 是否是全局模式,exec() 都会把完整的细节添加到它返回的数组中。这就是 exec() 与 String.match() 的不同之处,后者在全局模式下返回的信息要少得多。因此我们可以这么说,在循环中反复地调用 exec() 方法是唯一一种获得全局模式的完整模式匹配信息的方法。

RegExpObject.exec(string)

参数

  • 必需
    • string 要检索的字符串。
var str = "Visit W3School";var reg = new RegExp("W3School","g");var result;while ((result = reg.exec(str)) != null)  {    document.write(result);    document.write("<br />");    document.write(reg.lastIndex);}结果    W3School    14
  1. test
    用于检测一个字符串是否匹配某个模式

返回值

如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false。

说明

调用 RegExp 对象 r 的 test() 方法,并为它传递字符串 s,与这个表示式是等价的:(r.exec(s) != null)。

RegExpObject.test(string)

参数

  • 必需
    • string 要检索的字符串。
var str = "Visit W3School";var reg = new RegExp("W3School");var result = reg.test(str); // true

String 对象的正则方法

用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串

返回值

stringObject 中第一个与 regexp 相匹配的子串的起始位置。

说明

search() 方法不执行全局匹配,它将忽略标志 g。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始进行检索,这意味着它总是返回 stringObject 的第一个匹配的位置。

注释:如果没有找到任何匹配的子串,则返回 -1。

stringObject.search(regexp)

参数

  • 必需
    • regexp 该参数可以是需要在 stringObject 中检索的子串,也可以是需要检索的 RegExp 对象。
var str="zsh"document.write(str.search("zsh")) // 0

2. match

可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置

返回值

存放匹配结果的数组。该数组的内容依赖于 regexp 是否具有全局标志 g。

说明

match() 方法将检索字符串 stringObject,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。

如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明的是对 stringObject 的引用。

如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。

注释:在全局检索模式下,match() 即不提供与子表达式匹配的文本的信息,也不声明每个匹配子串的位置。如果您需要这些全局检索的信息,可以使用 RegExp.exec()。

stringObject.match(searchvalue|regexp)

参数

  • 必需
    • searchvalue 规定要检索的字符串值。
    • regexp 规定要匹配的模式的 RegExp 对象。如果该参数不是 RegExp 对象,则需要首先把它传递给 RegExp 构造函数,将其转换为 RegExp 对象。
var str="Hello world!"document.write(str.match("world") + "<br />")document.write(str.match("World") + "<br />")document.write(str.match("worlld") + "<br />")document.write(str.match("world!"))结果    world    null    null    world!

3. replace

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

返回值

一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。

说明

字符串 stringObject 的 replace() 方法执行的是查找并替换的操作。它将在 stringObject 中查找与 regexp 相匹配的子字符串,然后用 replacement 来替换这些子串。如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。

replacement 可以是字符串,也可以是函数。如果它是字符串,那么每个匹配都将由字符串替换。但是 replacement 中的 $ 字符具有特定的含义。如下表所示,它说明从模式匹配得到的字符串将用于替换。

注释:在全局检索模式下,match() 即不提供与子表达式匹配的文本的信息,也不声明每个匹配子串的位置。如果您需要这些全局检索的信息,可以使用 RegExp.exec()。

注意:ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。

stringObject.replace(regexp/substr,replacement)

参数

  • 必需
    • regexp/substr 规定子字符串或要替换的模式的 RegExp 对象。请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。
    • replacement 一个字符串值。规定了替换文本或生成替换文本的函数。
var str="zsh is good boy"document.write(str.replace(/good/, "bad"))结果    zsh is bad boy

文档内容出自 W3cSchool和菜鸟教程,
如需查看更详细的有关内容 请登录 http://www.w3school.com.cn/ 和 http://www.runoob.com/

原创粉丝点击