正則表達式是一種定義字符模式的方法,我們可以拆分,查找或替換字符串中與模式字符匹配的字符。
創建RegExp對象
在JavaScript中,正則表達式是通過RegExp對象使用的,RegExp對象是JavaScript中的一個內置對象,與String,Array類似。RegExp對象有自己的方法和屬性,其test()方法可以測試傳入的參數字符串是否匹配RegExp對象中定義的模式。可以通過兩種方式創建新的RegExp對象。
一種是采用正則表達式字面量,例如:
var myRegExp=/\b'|'\b/;
其中,斜杠(/)表示正則表達式的開始和結束。這個特殊的語法告訴JavaScript,這是一個正則表達式。
另一種是使用RegExp對象的構造函數RegExp(),例如:
var myRegExp=new RegExp("\\b'|'\\b");
使用構造函數創建RegExp對象的方式允許在運行期間(在代碼執行時而不是在編寫代碼時)確定正則表達式。例如,當正則表達式需要以用戶的輸入為基礎時,這種方式就非常有用。
需要注意的是,在JavaScript字符串中,反斜杠表示一個轉義字符。例如,\b表示退格。為了區分\b是字符串中的轉義字符,還是正則表達式中的特殊字符,必須在正則表達式特殊字符之前再加一個反斜杠。因此\b就變成了\b,表示正則表達式中匹配單詞分界的特殊字符,而不是退格字符。
對于所有正則表達式的特殊字符,如\w,\b,\d等,當使用構造函數RegExp()創建它們時,都必須在之前再添加一個反斜杠\。
RegExp屬性
RegExp對象有三個可以定義的屬性,如圖所示:
G全局匹配,查找所有與模式匹配的子串,而不是在找到第一個匹配的子串后就停止I模式不區分大小寫。例如,將Paul與paul視為相同的字符模式M多行標志。指定特殊字符^和$可以匹配多行文本和字符串的開始和結束
使用方法與上面的創建方法對應,有兩種方式。
如果想執行全局查找,并忽略大小寫有如下兩種方式:
var myRegExp=/content/gi;var myRegExp=new RegExp("content","gi");
正則表達式:特殊字符
1.文本,數字和標點符號
第一組特殊字符包含字符類(Character class)的特殊字符。字符類指數字,字母和空白字符。特殊字符如表所示:
\d0~9的任何數字\d\d將匹配72,但不匹配aa或者7a\D任何非數字字符\D\D\D匹配abc,但不匹配123或者8ef\w任何單詞字符,即A~Z,a~z,0~9,以及下劃線(_)字符\w\w\w匹配Ab_2,但不匹配$%*或者Ab_@\W任何非單詞字符\W匹配@,但不匹配a\s任何空白字符\s與制表符,回車符,換頁符和豎杠匹配\S任何非空白字符\S匹配A,但不匹配制表符.除換行符(\n)之外的任意單個字符.匹配a或者4,或者@[…]匹配位于方括號之內的任何一個字符,[a-z]將匹配在a~z范圍內的任何字符[abc]匹配a,b或c,但不匹配任何其他字符[^…]匹配除方括號內的字符之外的任何字符[^abc]將匹配除了a,b或c之外的任何字符,[^a-z]將匹配除了a~z范圍之外的任何字符
2.重復字符
正則表達式包含重復字符,用于指定要匹配多少個后一項或字符。
{n}前一項出現n次x{2}與xx匹配{n,}前一項出現n次,或者n次以上x{2,}匹配xx,xxx,xxxx,xxxxx等{n,m}前一項至少出現n次,最多出現m次x{2,4}匹配xx,xxx和xxxx?前一項出現0次或1次x?匹配空串或者x+前一項出現1次或多次x+匹配x,xx,xxx,xxxx,xxxxx等*前一項出現0次或多次x*匹配空串,或者x,xx,xxx,xxxx等
3.位置字符
第三組特殊字符可以指定匹配從哪里開始或結束,或者哪些字符位于字符模式的某一端。例如,有時模式應位于字符串或文本行的開始位置,有時模式應位于兩個單詞之間。如下表列出了最常見的位置字符及其含義:
^模式必須位于字符串的開頭,如果是多行字符串,模式就位于一行的開頭。對于多行文本(即包含回車符的字符串),在定義正則表達式時,需要使用/myreg ex/m設置多行標記。注意,該字符僅能用于IE5.5和NN6及其更新版本$模式必須位于字符串的結束位置,如果是多行字符串,模式就位于一行的結束位置。對于多行文本(即包含回車符鵝字符串),在定義正則表達式時,需要使用/myreg ex/m設置多行標記。注意,該字符僅能用于IE5.5和NN6及其更新版本\b匹配單詞分界位置,即單詞字符與非單詞字符之間的位置\B匹配非單詞分界位置
例如,如果要確保模式位于一行的開頭,可使用如下代碼:
^myPattern
這將與一行開頭的myPattern匹配。
要在一行的結尾匹配該模式,可使用如下代碼:
myPattern$
單詞分界字符\b和\B容易引起混淆,因為它們不匹配字符,而是匹配字符之間的位置。
任何單詞字符(即字母,數字或下劃線字符)之間的位置以及與任何非單詞字符都是單詞分界。另外注意,字符串的開始或結束位置與單詞字符之間的邊界也是單詞分界。
任何字母,數字或下劃線與另一個字母,數字或下劃線之間的位置都是非單詞分界。另外,兩個非單詞字符之間的位置,如感嘆號和逗號之間的位置,也是一個非單詞分界。
例如如下一個示例:
<script> var myRegExp1=/\b/g; var myRegExp2=/\B/g var myString="Hello world!,let's look at boundaries said 007."; document.write(myString+"
"); document.write("\\b匹配單詞分界位置
"); document.write(myString.replace(myRegExp1,"|")+"
"); document.write("\\B匹配非單詞分界位置
"); document.write(myString.replace(myRegExp2,"|")); </script>
該示例的輸出為:
Hello world!,let’s look at boundaries said 007.
\b匹配單詞分界位置
|Hello| |world|!,|let|’|s| |look| |at| |boundaries| |said| |007|.
\B匹配非單詞分界位置
H|e|l|l|o w|o|r|l|d!|,l|e|t’s l|o|o|k a|t b|o|u|n|d|a|r|i|e|s s|a|i|d 0|0|7.|
正則表達式的分組
如果要把多個表達式處理為一個組,只需要將它們放在圓括號中,如/(\d\d)/。正則表達式中的圓括號是把字符模式組合在一起的特殊字符,圓括號本身不是要匹配的字符。
為什么要對正則表達式分組?將字符組合到模式中后,可以對整個字符組應用重復字符,而不是對單個字符應用重復字符。
例如定義一個字符串”JavaScript,VBScript and PHP”,如何使用同一個正則表達式匹配JavaScript和VBScript?一個簡單的辦法是使用圓括號組合模式Java和VB,然后對每一個字符組應用特殊字符?,使模式匹配Java或VB子字符串出現0次或1次,且以Script子字符串結尾的單詞。
var myRegExp=/\b(VB)?(Java)?Script\b/gi;
一種改進的完整代碼,使用|或關鍵字來優化代碼:
<script> var myString="JavaScript,VBScript and PHP"; var myRegExp=/\b(VB|Java)?Script\b/gi; myString=myString.replace(myRegExp,"xxxx"); document.write(myString); </script>
重用字符組
可以在正則表達式中重用通過一組字符指定的模式。要引用前面的字符組,只需要輸入\和表示分組順序的數字即可。例如,第1個分組可引用為\1,第2個分組可引用為\2,依次類推。
例如定義一個字符串”007,007,001,002,002,002,003,002,004”,替換掉連續出現3個數字的字符串,如下代碼所示:
<script> var myString="007,007,001,002,002,002,003,002,004"; var myRegExp=/(\d+),\1,\1/g; myString=myString.replace(myRegExp,"Error"); document.write(myString); </script>
上面代碼的結果為:
007,007,001,Error,003,002,004
上面的代碼/(\d+),\1,\1/g匹配了一個數字系列,這定義了一個分組,其字符模式是一個或多個數字字符。將一個數字放在一個字符組中,然后可以指定再次匹配這個數字,為此使用\1,它表示:匹配使用圓括號定義的第一組中的字符。
String對象replace方法中匹配分組
String對象中replace()方法的獨特之處在于它可以根據與正則表達式匹配的分組來替換文本。為此,要使用 $ 符號和分組的序號。正則表達式中的每個分組都給定了一個1~99之間的數字,大于99的分組是不可以訪問的。要引用一個分組,可以使用$符號,后跟分組的序號。例如,對于下面的代碼:
var myRegExp=/(\d)(\W)/g;
$1引用分組(\d),$2引用分組(\W)。
例如有字符串”2012,2013,2014”,如果想通過正則表達式把它改為”the year 2012,the year 2013,the year 2014”。首先,需要寫出作為正則表達式的模式,在本例中就是4個數字,即:
var myRegExp=/\d{4}/g;
但是每一次匹配的年份都是不同的,如何把對應的年分值放在替換字符串中呢?這時就需要使用分組了,修改正則表達式,把它放在一個分組中,如下所示:
var myRegExp=/(\d{4})/g;
然后就可以在替換字符串中使用序號為1的分組了:
var myString="2012,2013,2014"; var myRegExp=/(\d{4})/g; myString=myString.replace(myRegExp,"the year $1"); document.write(myString+"");
上面代碼的輸出結果為:
the year 2012,the year 2013,the year 2014
看文倉www.kanwencang.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20170301/108582.html
文章列表