js中適用於正則匹配的RegExp 對象方法和String對象方法


最近項目中一直要用的正則,而且也不是匹配常用的正則規則比如手機號和身份證號之類了,所以就把正則語法看了遍。上篇文章有關於正則的語法和正則在線轉換工具。

今天總結下 js中適用於正則匹配的RegExp對象和String對象的方法。(里面的知識點主要是參考於w3c)

一,先說RegExp對象的方法

 

方法名 語法 參數 返回值 說明 案例
test()
RegExpObject.test(string)
 string:必需是字符串
 
如果字符串 string 中含有與 RegExpObject 匹配的文本,則返回 true,否則返回 false
 
調用 RegExp 對象 r 的 test() 方法,並為它傳遞字符串 s,與這個表示式是等價的:(r.exec(s) != null)。可以匹配全局
 
var str = "Visit W3School";
var patt1 = new RegExp("W3School");
var result = patt1.test(str); document.write("Result: " + result);
//輸出:Result: true
exec()
RegExpObject.exec(string)
 string:必需是字符串  返回一個數組,其中存放匹配的結果。如果未找到匹配,則返回值為 null。

1,如果是非全局RegExp對象與返回的數組與調用方法 String.match() 返回的數組是相同的。

2,如果是全局RegExp對象的時候它會在 RegExpObject 的 lastIndex 屬性指定的字符處開始檢索字符串 string。當 exec() 找到了與表達式相匹配的文本時,在匹配后,它將把 RegExpObject 的 lastIndex 屬性設置為匹配文本的最后一個字符的下一個位置。exec() 都會把完整的細節添加到它返回的數組中而match不會。所以在循環中反復地調用 exec() 方法是唯一一種獲得全局模式的完整模式匹配信息的方法。

 

var str = "Visit W3School, W3School is a place to study web technology.";
var patt = new RegExp("W3School","g");
var result;

while ((result = patt.exec(str)) != null) {
document.write(result);
document.write("<br />");
document.write(patt.lastIndex);
document.write("<br />");
}

輸出:

W3School
14
W3School
24

 compile() RegExpObject.compile(regexp,modifier)

 regexp:正則對象

modifier:匹配類型

 無  

compile() 方法用於在腳本執行過程中編譯正則表達式。

compile() 方法也可用於改變和重新編譯正則表達式。

 
var str="Every man in the world! Every woman on earth!";

patt=/man/g;
str2=str.replace(patt,"person");
document.write(str2+"<br />");

patt=/(wo)?man/g;
patt.compile(patt);
str2=str.replace(patt,"person");
document.write(str2);
輸出
Every person in the world! Every woperson on earth!
Every person in the world! Every person on earth!

二,再說String對象的檢測查詢方法。這些方法都使用於字符串和正則的匹配

     

 

 

方法名 語法 參數 返回值 說明 案例
search() stringObject.search(regexp)  regexp:可以是字符串也可以說RegExp對象  stringObject 中第一個與 regexp 相匹配的子串的起始位置。如果沒有找到任何匹配的子串,則返回 -1。  search() 方法不執行全局匹配,它將忽略標志 g。它同時忽略 regexp 的 lastIndex 屬性,並且總是從字符串的開始進行檢索,這意味着它總是返回 stringObject 的第一個匹配的位置。  
var str="Visit W3School!"
document.write(str.search(/w3school/i))

 輸出:6

 match()  
stringObject.match(searchvalue)
stringObject.match(regexp)
 
searchvalue:字符串
regexp:正則
 返回一個數組,其中存放匹配的結果。如果未找到匹配,則返回值為 null。

 1,非全局RegExp對象match() 方法就只能在 stringObject 中執行一次匹配。如果沒有找到任何匹配的文本, match() 將返回 null。否則,它將返回一個數組,其中存放了與它找到的匹配文本有關的信息。該數組的第 0 個元素存放的是匹配文本,而其余的元素存放的是與正則表達式的子表達式匹配的文本。除了這些常規的數組元素之外,返回的數組還含有兩個對象屬性。index 屬性聲明的是匹配文本的起始字符在 stringObject 中的位置,input 屬性聲明的是對 stringObject 的引用。

2,全局RegExp對象match() 方法將執行全局檢索,找到 stringObject 中的所有匹配子字符串。若沒有找到任何匹配的子串,則返回 null。如果找到了一個或多個匹配子串,則返回一個數組。不過全局匹配返回的數組的內容與前者大不相同,它的數組元素中存放的是 stringObject 中所有的匹配子串,而且也沒有 index 屬性或 input 屬性。

3,在全局檢索模式下,match() 即不提供與子表達式匹配的文本的信息,也不聲明每個匹配子串的位置。如果您需要這些全局檢索的信息,可以使用 RegExp.exec()。如果需要循環對每個相匹配的內容去做一系列的操作的話就用RegExp.exec()。

 
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!
 replace()  
stringObject.replace(regexp/substr,replacement)

 regexp/substr:字符串或者正則對象

replacement:一個字符串值。規定了替換文本或生成替換文本的函數。

 

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

 

字符串 stringObject 的 replace() 方法執行的是查找並替換的操作。它將在 stringObject 中查找與 regexp 相匹配的子字符串,然后用 replacement 來替換這些子串。如果 regexp 具有全局標志 g,那么 replace() 方法將替換所有匹配的子串。否則,它只替換第一個匹配子串。

replacement 可以是字符串,也可以是函數。如果它是字符串,那么每個匹配都將由字符串替換。但是 replacement 中的 $ 字符具有特定的含義。如下表所示,它說明從模式匹配得到的字符串將用於替換。

字符 替換文本
$1、$2、...、$99 與 regexp 中的第 1 到第 99 個子表達式相匹配的文本。
$& 與 regexp 相匹配的子串。
$` 位於匹配子串左側的文本。
$' 位於匹配子串右側的文本。
$$ 直接量符號。

注意:ECMAScript v3 規定,replace() 方法的參數 replacement 可以是函數而不是字符串。在這種情況下,每個匹配都調用該函數,它返回的字符串將作為替換文本使用。該函數的第一個參數是匹配模式的字符串。接下來的參數是與模式中的子表達式匹配的字符串,可以有 0 個或多個這樣的參數。接下來的參數是一個整數,聲明了匹配在 stringObject 中出現的位置。最后一個參數是 stringObject 本身。


例子 1

在本例中,我們將使用 "W3School" 替換字符串中的 "Microsoft":

<script type="text/javascript">

var str="Visit Microsoft!"
document.write(str.replace(/Microsoft/, "W3School"))

</script>

輸出:

Visit W3School!

例子 2

在本例中,我們將把 "Doe, John" 轉換為 "John Doe" 的形式:

name = "Doe, John";
name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");

例子 3

在本例中,我們將把字符串中所有單詞的首字母都轉換為大寫:

name = 'aaa bbb ccc';
uw=name.replace(/\b\w+\b/g, function(word){
  return word.substring(0,1).toUpperCase()+word.substring(1);}
  );

 

 split()   stringObject.split(separator,howmany)

 separator:字符串或正則表達式

howmany:可選。該參數可指定返回的數組的最大長度

 一個字符串數組  

注釋:如果把空字符串 ("") 用作 separator,那么 stringObject 中的每個字符之間都會被分割。

注釋:String.split() 執行的操作與 Array.join 執行的操作是相反的。

 

例子 1

在本例中,我們將按照不同的方式來分割字符串:

<script type="text/javascript">

var str="How are you doing today?"

document.write(str.split(" ") + "<br />")
document.write(str.split("") + "<br />")
document.write(str.split(" ",3))

</script>

輸出:

How,are,you,doing,today?
H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
How,are,you

例子 2

在本例中,我們將分割結構更為復雜的字符串:

"2:3:4:5".split(":")	//將返回["2", "3", "4", "5"]
"|a|b|c".split("|")	//將返回["", "a", "b", "c"]

例子 3

使用下面的代碼,可以把句子分割成單詞:

var words = sentence.split(' ')

或者使用正則表達式作為 separator:

var words = sentence.split(/\s+/)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM