摘要:正則表達式語法正則表達式是由普通字符例如數字字母標點和用來表示特定字符或字符集的元字符以及特殊字符用作限定條件或特殊功能的字符組成的文字模式。正則表達式的字符串表示,按照字面量形式而非傳入構造函數中的字符串模式返回。
正則表達式語法
正則表達式是由普通字符(例如數字、字母、標點和用來表示特定字符或字符集的元字符)以及特殊字符(用作限定條件或特殊功能的字符)組成的文字模式。
普通字符所有數字、小寫字母、大寫字母、標點都屬于普通字符。
而為了匹配除以上列出的字符集以外的字符,或者匹配特定范圍內的任意字符,需要使用元字符。元字符分直接量字符和字符類。
直接量字符字符 | 描述 |
---|---|
uXXXX | 由16進制數XXXX指定的unicode字符 |
xNN | 由16進制數NN指定的拉丁字符 |
o | NUL字符(u0000) |
t | 制表符(u0009) |
n | 換行符(u000A) |
v | 垂直制表符(u000B) |
f | 換頁符(u000C) |
r | 回車符(u000D) |
字符類元字符用來匹配特定范圍內的字符。一個字符類可以匹配它所包含的任意字符。
字符 | 描述 |
---|---|
. | 除了換行和行結束符之外的所有單個字符 |
w | 等價于[0-9a-zA-Z] |
W | 除了w以外的所有字符 |
s | 任何Unicode空白符 |
S | 任何非Unicode空白符的字符(范圍比w大) |
d | 等價于[0-9] |
D | 除了d以外的所有字符 |
[...] | 方括號內的任意字符 |
1 | 除了方括號內字符集的任意字符 |
當需要匹配多個指定的字符時,需要用到一些專門的特殊字符來表示重復匹配的次數。
字符 | 描述 |
---|---|
{n,m} | 匹配至少n次,但不能超過m次 |
{n,} | 匹配至少n次,無上限 |
{n} | 匹配n次 |
? | 匹配0次或1次,等價于{0,1} |
+ | 匹配1次或多次,無上限,等價于{1,} |
* | 匹配0次或多次,無上限,等價于{0,} |
重復字符需要與普通字符配合使用,如[a-z]{3,5},即匹配3個到5個小寫字母。
錨字符當需要匹配以指定字符開頭或結尾的字符串時,需要用到錨字符。
字符 | 描述 |
---|---|
^ | 匹配字符串的開頭,在多行檢索中,匹配一行的開頭 |
$ | 匹配字符串的結尾,在多行檢索中,匹配一行的結尾 |
(?=p) | 零寬正向先行斷言,要求接下來的字符都與p匹配,匹配結果不包含p |
(?!p) | 零寬負向先行斷言,要求接下來的字符不能和p匹配 |
b | 匹配一個字邊界(需要和其他表達式配合使用,多帶帶使用[b]表示退格符) |
B | 匹配一個非字邊界 |
例:需要匹配以字母、下劃線或$開頭的字符串來校驗變量名是否合法,可以使用/^[a-zA-Z_$].*/
注:^在方括號[]內部表示反向匹配。
零寬先行斷言可以將任何正則表達式都做為結尾錨點,q(?=p)表示匹配所有以p結尾的q字符串,匹配結果僅包含q部分,不包含錨點p。
例:匹配以”.”結尾的字符串,可以使用/w+(?=.)/g
則匹配"a.b.c.d.e.f"的結果為["a","b","c","d","e"]。f后沒有.,所以不被匹配。
q(?!p)表示匹配所有不以p結尾的q字符串。
注:javascript不支持后行斷言,即不能將正則表達式作為開始錨點。
b可以用來匹配一個單詞的開頭或結尾。例:匹配String中的Str用/bStr/,匹配String中的ing用/ingb/
B可用來匹配一個單詞的中間部分。例:匹配String中的trin用/BtrinB/
選擇、分組和引用字符字符 | 描述 |
---|---|
| | 選擇匹配,“|”左邊的表達式和右邊的表達式皆可匹配 |
(...) | 分組匹配,將幾個項組合為一個單元,這個單元可以用"*","+","?","|","{n,m}"等符號加以修飾。而且可以記住和這個組合相匹配的字符。 |
(?:...) | 非捕獲性分組,只負責匹配,不記憶與該組相匹配的字符 |
(?:...)和(...)的差異僅僅存在與匹配結果,當需要記錄某一部分匹配項時,用(...)。若只是用來匹配,后續不需要使用分組匹配到的字符串,則用(?:...)
轉義字符字符 | 描述 |
---|---|
RegExp實例化有兩張方式。一種通過字面量實例化,一種通過new RegExp()構造函數實例化
var exp = / pattern / flags; //RegExp字面量 var exp = new RegExp("pattern","flags"); //RegExp構造函數
flags用來表示正則表達式的行為。可選項有g,i,m三個標識,可同時定義一個或多個標識。
g:global,表示全局模式。flags中包含g時,表達式匹配所有能夠匹配上的字符串;如果沒包含g時,則當匹配到第一個字符串時,即停止匹配。
i:case-insentive,表示忽略大小寫。flags中包含i時,表達式匹配時忽略字符串的大小寫。
m:multi-line,表示多行匹配。flags中包含m時,表達式匹配到一行文本末尾時還會繼續查找下一行中是否存在匹配項。
pattern即正則表達式語句。
RegExp構造函數優勢在于可以動態傳入正則表達式。
RegExp實例屬性 globalboolean值,表示是否設置了g標志。
ignoreCaseboolean值,表示是否設置了i標志。
multilineboolean值,表示是否設置了m標志。
source正則表達式的字符串表示,按照字面量形式而非傳入構造函數中的字符串模式返回。
lastIndex整數,表示開始搜索下一個匹配項的字符位置,從0 算起。
例:
var exp = /[bc]at/gi; exp.global;//true exp.ignoreCase;//true exp.multiline;//false exp.source;//“[bc]at”RegExp實例方法 exec()
exec方法接受一個參數,即需要應用模式的字符串,然后返回包含第一個匹配項信息的數組,或者在沒有匹配項時返回null。返回的數組是Array實例,但還包含額外兩個屬性:index和input。
一句句解釋。
返回包含第一個匹配項信息的數組,或者在沒有匹配項時返回null:
這里分兩種情況,一種是global匹配,一種是非global匹配。
global模式執行exec()匹配成功一次以后,再次執行exec()時,會從前一次匹配的最后一位開始繼續向后匹配。例:
var exp = /.at/g var matches = exp.exec("cat, bat, sat, fat"); //第一次匹配 matches.index => 0 matches.input => "cat, bat, sat, fat" matches => ["cat"] exp.lastIndex => 3 matches = exp.exec("cat, bat, sat, fat"); //第二次匹配 matches.index => 5 matches.input => "cat, bat, sat, fat" matches => ["bat"] exp.lastIndex => 8 ...
非global模式執行exec()匹配成功一次以后,再次執行exec()時,會從頭開始重新匹配。
var exp = /.at/ var matches = exp.exec("cat, bat, sat, fat"); //第一次匹配 matches.index => 0 matches.input => "cat, bat, sat, fat" matches => ["cat"] exp.lastIndex => 0 matches = exp.exec("cat, bat, sat, fat"); //第二次匹配 matches.index => 0 matches.input => "cat, bat, sat, fat" matches => ["cat"] exp.lastIndex => 0
返回的數組是Array實例:
當使用(...)分組匹配時,一次exec()會匹配到多個結果
var exp = /(there)s+(you)s+(are)/; var matches = exp.exec("hey, there you are my dear"); matches = ["there you are", "there", "you", "are"];
matches[0]匹配整個表達式字符串。
matches[1]匹配第一個(...)內的字符串,之后以此類推。
補充說明:含(?:...)非捕獲分組的表達式執行exec后返回的數組中不包含(?:...)匹配的字符串。非捕獲性分組(?:...)和捕獲性分組(...)的區別就在這里。
屬性index和input:
index表示匹配項在字符串中的起始位置。
input表示應用正則表達式的字符串。
test方法接受一個參數作為需要應用模式的字符串,在模式與該參數匹配的情況下返回true,否則返回false。在只想知道目標字符串與某個模式是否匹配,但不需要知道其文本內容的情況下,使用這個方法非常方便。因此,test()方法經常被用在if 語句中。
用于模式匹配的string方法string有四個方法可以將正則表達式作為參數傳入。
search()str.search(exp)返回str中第一個與exp表達式匹配的字符串的起始位置。如果找不到匹配項,返回-1。如果search傳入的參數是一個string,則首先會通過RegExp構造函數將其轉換為正則表達式。search不支持全局搜索,它會忽略global標識。
"JavaScript".search(/script/i) => 4replace()
str.replace(exp, replaceStr)第一個參數是一個正則表達式,第二個參數是要替換成的字符串。如果exp帶有global標識,那么源字符str中所有與exp表達式匹配的子串都會被替換。如果不帶g,str中僅第一個與exp匹配的子串會被替換。
text.replace(/javascript/gi, "JS") //將text全文中所有javascript改為JS
replaceStr中如果出現$加數字N的字符串,表示第N個子表達式相匹配的文本。
text.replace(/"([^"]*)"/g, ""$1"") //將text全文中所有被""引用的子串替換成被""引用。match()
str.match(exp)返回一個由匹配結果組成的數組。
該數組不同于RegExp實例方法exex()返回的數組。當有global標識時,match返回全局匹配到的所有字符串組成的數組;當沒有global標識時,match就返回第一個匹配到的字符串組成的單元素數組。
"11+2=13".match(/d/g) => ["1","1","2","1","3"] "11+2=13".match(/d/) => ["1"]
match方法不會返回捕獲性組合匹配到的子串,(...)分組匹配在match方法中不會像RegExp實例方法exec()一樣返回匹配的子串。
split()當split方法傳入的參數為正則表達式時,這使得split()方法異常強大。例如,可以指定分隔符,允許兩邊可以留有任意多的空白符:
"1 , ,2 , 3 , 4 , 5".split(/s*,s*/) => ["1","2","3","4","5"]
... ?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/80112.html
摘要:控制權和傳動這兩個詞可能在搜一些博文或者資料的時候會遇到,這里做一個解釋先控制權是指哪一個正則子表達式可能為一個普通字符元字符或元字符序列組成在匹配字符串,那么控制權就在哪。 溫馨提示:文章很長很長,保持耐心,必要時可以跳著看,當然用來查也是不錯的。 正則啊,就像一座燈塔,當你在字符串的海洋不知所措的時候,總能給你一點思路;正則啊,就像一臺驗鈔機,在你不知道用戶提交的鈔票真假的時候,...
摘要:它的語法是被匹配字符串一個正則組成的數組,比如,,該方法返回與匹配鏈條正則數組最后一個正則的匹配內容,或一個空數組。 好像網上介紹JS正則庫的文章不多,可能也是因為復雜的正則匹配很少需要在客戶端運行,所以JS上用的不多,并且我搜JS的正則庫還真沒找到第二個,囧。但它的一些特性挺實用,有興趣的同學可以看看。由于沒花太多時間去琢磨,所以本文只將該庫作簡要介紹,本文用例全部來自它的API文檔...
摘要:寫在前面正在看的源碼看到了部分感覺以前看的正則表達式基礎知識已經完全不夠用了現翻閱博客資料將一些中正則表達式難用的部分總結歸納方便自己和友翻閱正則分組重復匹配對于重復的匹配我們經常使用到正則表達式的分組功能我們使用正則匹配地址來實踐一下假 [TOC] 寫在前面 - Lionad 正在看VueJS的源碼, 看到了HtmlParser部分, 感覺以前看的正則表達式基礎知識已經完全不夠用了,...
摘要:非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。 導讀 你有沒有在搜索文本的時候絞盡腦汁, 試了一個又一個表達式, 還是不行. 你有沒有在表單驗證的時候, 只是做做樣子(只要不為空就好), 然后燒香拜佛, 虔誠祈禱, 千萬不要出錯. 你有沒有在使用sed 和 grep 命令的時候, 感覺莫名其妙, 明明應該支持的元字符, 卻就是匹配不到. 甚至,...
摘要:玩轉對象中的正則表達式的正則表達式語法極大地借鑒了另一種腳本語言的正則表達式語法對象是的一個內置對象,與,類似。創建對象可通過構造函數創建。當要根據用戶輸入來構造正則表達式時,必須采用構造函數方式。如與被看做相同的字符模式。 玩轉javascript RegExp對象 js中的正則表達式 js的正則表達式語法極大地借鑒了另一種腳本語言Perl的正則表達式語法.RegExp對象是js的一...
閱讀 1438·2021-09-22 15:52
閱讀 1485·2019-08-30 15:44
閱讀 906·2019-08-30 14:24
閱讀 2717·2019-08-30 13:06
閱讀 2713·2019-08-26 13:45
閱讀 2796·2019-08-26 13:43
閱讀 1031·2019-08-26 12:01
閱讀 1458·2019-08-26 11:56