JS-RegExp正則表達式的對象

RegExp 對象

RegExp 對象表示正則表達式,它是對字符串執行模式匹配的強大工具。

直接量語法

/pattern/attributes

var 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/

發佈了44 篇原創文章 · 獲贊 12 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章