在js中使用正規表示式的目的是使用某種規則匹配字串或子字串
與建立陣列相同,建立regexp物件有兩種方法,一種是字面量,一種是使用建構函式。
使用字面量: var reg = /\d/g; //用兩個斜槓包裹匹配規則
使用建構函式: var reg = new regexp('\\d', 'g'); //第乙個引數是匹配規則,同時需要對'\'進行轉義。
可以看到,在兩種定義方式中,都有乙個'g',它是正規表示式的修飾符。regexp包括的修飾符有:
'g':全文搜尋,否則只會匹配到第乙個結果為止
'i':忽略大小寫,無論大小寫都會進行匹配
'm':多行匹配
含義:在正規表示式中具有特殊含義的非字母字元
包括: . ^ $ * \ [ ]
字元類通常情況下,正規表示式中的乙個字元匹配字串中的乙個字元,但是通過'[ ]'可以匹配多個字元。
var reg = /[abc]/g //此表示式會匹配全文中的字母a或者b或者c
'a1b2c3d4'.replace(reg, 'x') //最終結果是'x1x2x3d4'
還可以通過'^'字元匹配非操作:
var reg = /[^abc]/g //此表示式會匹配全文中除了字母a、b、c以外的字元
範圍類很多時候,我們需要匹配字母,數字。使用字元類會顯得非常冗雜,例如:[0123456789]
使用字元 '-' 可以表示這種情況:
var reg = /[a-z]/g //匹配全文中的小寫字母
var reg = /[a-za-z]/g //匹配全文中的大小寫字母
如果字元 '-' 在兩個字元之間,表示範圍。如果想匹配 '-',則可以在後面加上字元 '-'
var reg = /[a-z-]/g //匹配全文中的小寫字母和字元'-'
預定義類
在js中,定義了一些常用的字元供使用:
. 除了回車符合換行符的任意字元 [^\r\n]
\d 數字字元 == [0-9]
\d 非數字字元 [^0-9]
\s 空白符 [\r\n\t\f]
\s 非空白符 [^\r\n\t\f]
\w 字母數字下劃線 [a-za-z0-9_]
\w 除了字母數字下劃線 [^a-za-z0-9_]
還有幾個代表邊界的字元:
^ 以***為開始
$ 以***為結束
\b 單詞邊界
\b 非單詞邊界
其中的元字元'^'在[ ]中時,表示的是除了,取反,但不在[ ]中時,表示的是以什麼為開頭。
量詞在我們想要表達出現5次的數字時,可以這樣寫:\d\d\d\d\d。但是當需要匹配出現100次的數字時,這種方式顯然是不現實的,在js中,也有一些量詞來修飾字元。
? 最多出現一次(0次或一次)
+ 最少出現一次
* 出現任意次(可以是0次,可以是一次或以上)
出現n次
至少出現n次,最多出現m次
前面所說的匹配出現100次的數字可以是: \d
貪婪模式和非貪婪模式
一般情況下,js的匹配會盡可能多地匹配,例如'12345678'.replace(/\d/, 'x'),這種情況下應該匹配3個數字還是6個數字?在js中,會盡可能多匹配,所以會匹配6個數字,最後的結果就是'x78'。這種情況稱為貪婪模式。
那如果我們有需求,希望匹配3位數字,這時候可以使用修飾符 '?' ,例如'12345678'.replace(/\d?/, 'x'),那麼最後的結果就是'xx78'。這種情況稱為非貪婪模式。
分組有這樣一種場景,匹配出現三次的abcd,按照我們以前的想法,可能會這麼寫:/abcd/。但是請你冷靜分析一下,這樣寫的結果最後匹配到的是abcddd,而不是3次abcd。
這時候,就可以使用 '( )' 來進行分組,達到我們的效果:/(abcd)/
分組還有乙個更強大的功能,在分組**獲之後,可能根據其匹配的順序,使用'$1', '$2'等來代替**獲的分組。具體示例:
2016-12-21 -----> 12/21/2016
'2016-12-21'.repalce('/(\d)-(\d)-(\d)/', '$2/$1/$3')
其中的$1捕獲到的是2016, $2捕獲到的是12,$3捕獲到的是21
前瞻文字的尾部稱為前,前瞻的意思是在匹配到滿足條件的內容後,還會向前檢查是否符合斷言。符合才算匹配成功。具體示例:
希望將字母後面緊跟數字的字母替換成 'x'
var reg = /[a-za-z](?=\d)/ //其中的(?=\d)用來匹配斷言,即是字母後面緊跟的數字
var reg = /[a-za-z](?!\d)/ //其中的(?!\d)用來匹配字母後面緊跟的不是數字
在regexp物件的方法,常用的有test( )和exec( )
test( )用來檢測字串中是否有滿足匹配規則的結果,有的話返回true,沒有的話返回false
需要注意的是,需要注意的是,如果匹配規則中存在修飾符 'g',那匹配的結果會變得很詭異。你可能會看到一會是true,一會是false。(這是由於lastindex屬性的作用,因此在純粹去判斷是否在在字串中存在匹配內容時,不用加g)
varexec( )返回的結果是乙個類陣列,陣列的第乙個值代表了匹配到的滿足的字串,第二值是匹配規則中的分組匹配到的值,第三個值是匹配規則中的分組匹配到的值(如果存在多個分組的話),同時儲存了乙個index屬性,表示滿足匹配的字串的起始位置,還有input屬性,表示源字串。reg
= /\w/
if(reg.test('a1c2b4'))
var結果是:reg
= /\w(\d)(\w)/, ret;
if(ret
= reg.exec('a1c2b4'))
字串相關方法
str.search( reg)
用來搜尋字串中滿足匹配規則的第乙個字串,返回其index,否則返回-1。標誌'g'對結果沒有影響
str.match(reg)
用來匹配字串滿足匹配規則的乙個或多個字串。標誌 'g'對結果有影響。
當沒有標誌'g',即是非全域性呼叫的情況時,返回乙個類陣列。匹配到第乙個符合規則的字串為止。
var返回的結果與exec返回的相同,類陣列的第乙個值是匹配到的字串,第二值是匹配規則中的分組匹配到的值,第三個值是匹配規則中的分組匹配到的值(如果存在多個分組的話),同時儲存了乙個index屬性,表示滿足匹配的字串的起始位置,還有input屬性,表示源字串。reg
= /\w(\d)(\w)/, ret;
if(ret
= 'a1c2b4'.match(reg))
如果有標誌'g',則返回乙個陣列,儲存的都是匹配到的字串結果。
varstr.split(reg)將匹配到的字串作為分隔符劃分源字串得到陣列。reg
= /\w(\d)(\w)/g, ret;
if(ret
= 'a1c2b4'.match(reg))
var最後得到的結果為:reg
= /\d/g, ret;
ret
= 'a1b2c3d4'.split(reg)
將匹配到的字串替換成傳入的第二個字串。
var最後的結果為:reg
= /\d/g, ret;
ret
= 'a1b2c3d4'.replace(reg, 'x');
JavaScript高階 正規表示式
前言 這篇部落格是我對正規表示式一些基礎知識的整理。基礎部分 1.1 什麼是正規表示式 是一種特殊的字串模式 作用是匹配字串 如同用模具做產品,正規表示式就是模具,具體的字串就是產品 定義一種規則去匹配復合規則的字串 1.2 元字元介紹 會匹配行或者字串的開頭,有時會匹配整個文件的起始位置 匹配字串...
Javascript 高階篇 正規表示式
淺拷貝 拷貝就是複製,就相當於把乙個物件中的所有的內容,複製乙份給另乙個物件,直接複製,或者說,就是把乙個物件的位址給了另乙個物件,他們指向相同,兩個物件之間有共同的屬性或者方法,都可以使用 var obj1 另乙個物件 var obj2 寫乙個函式,作用 把乙個物件的屬性複製到另乙個物件中,淺拷貝...
Python總結之 正則高階
原來寫過一篇關於正規表示式的文章,這裡再補充幾個實際專案中用到的例子.注意 下面樣例都是scala 1 捕獲組命名 使用捕獲組的時候,程式設計師可能需要趴在顯示器上,用一張紙擋著螢幕,從左往右數括號,聚精會神好像拆彈,而且正規表示式一旦發生變化,group的index也會變.有潔癖的程式設計師不願意...