大家好,我是IT修真院深圳分院第06期學(xué)員,一枚正直善良的web程序員。
今天給大家分享一下,修真院官網(wǎng) JS-05任務(wù)中可能會使用到的知識點:
1.背景介紹
什么是正則表達式?
正則表達式(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE)使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串搜索模式。搜索模式可用于文本搜索和文本替換。
正則表達式是由一個字符序列形成的搜索模式。當你在文本中搜索數(shù)據(jù)時,你可以用搜索模式來描述你要查詢的內(nèi)容。正則表達式可以是一個簡單的字符,或一個更復(fù)雜的模式。正則表達式可用于所有文本搜索和文本替換的操作。
正則表達式中包含三種元素分別為:量詞、元字符、修飾符。
2.知識剖析
如何使用正則表達式
語法
/正則表達式主體/修飾符(可選)
其中修飾符是可選的。
舉例:
方式一:直接量語法
var test = /jnshu/;
var test = /jnshu/i;
方式二:創(chuàng)建 RegExp 對象的語法
var test = new RegExp("jnshu");
var test = new RegExp("jnshu","i");
TEST()方法
test() 方法是一個正則表達式方法。
test() 方法用于檢測一個字符串是否匹配某個模式,如果字符串中含有匹配的文本,則返回 true,否則返回 false。
/123456/.test("12345"); // false
/123456/.test("123456"); // true
/123456/.test("x123456y"); // true 只要包含了指定的字符串,則為true
修飾符
修飾符是影響整個正則規(guī)則的特殊符號,會對匹配結(jié)果和部分內(nèi)置函數(shù)行為產(chǎn)生不同的效果。
i 執(zhí)行對大小寫不敏感的匹配。
g 執(zhí)行全局匹配(查找所有匹配而非在找到第一個匹配后停止)。
m 執(zhí)行多行匹配。
y 執(zhí)行“粘性”搜索,匹配從目標字符串的當前位置開始,可以使用y標志。
元字符
元字符是使用正則表達式不同于普通字符的地方,也是正則表達式能夠發(fā)揮強大作用、具有強大表達能力的法寶。
那么什么是元字符呢?
元字符是一些在正則表達式中有特殊用途、不代表它本身字符意義的一組字符。利用元字符,我們可以控制字符串匹配的方式,例如:只在每一行的開始或結(jié)束位置匹配指定的模式,匹配固定距離的子串,匹配不出現(xiàn)的字符等等。
常用元字符
\d : 匹配數(shù)字 等價于[0-9]
\D : 匹配非數(shù)字 等價于[^\d]
\s : 匹配空白符
\S : 匹配非空白符 等價于[^\s]
\w : 用于匹配字母,數(shù)字或下劃線字符(例如程序中的變量字符) 等價于[A-Za-z0-9_]
\W : 用于匹配所有與\w不匹配的字符 等價于[^\w]
舉例:
/\d/.test("123"); // true
/\d/.test("1ab"); // true
/\D/.test("1ab"); // true
/\D/.test("112"); // false
字符類
匹配一類字符中的一個
[abc]: a或b或c
[0-9]: 一個數(shù)字
[^0-9]: 非數(shù)字的一個字符
[a-z]: 一個字母
. : 任一字符(換行除外)
多選分支
或
/thi(c|n)k/ === /thi[cn]k/ // thick或think
錨點
匹配一個位置
^ :起始位置
$ :結(jié)尾位置
\b :單詞邊界
舉例:
/^http:/ /^http:/.test("http://www.jnshu.com") //true
/\.jpg$/ /\.jpg$/.test("1.jpg") // true
/\bis\b/ /\bis\b/.test("this is tom") // true
如果要在正則表達式中使用元字符本身的話該怎么辦?
轉(zhuǎn)義符
使用的方法是把一個反斜杠(\)放在元字符前面,這樣元字符就失去了特殊的意義,還原會它本身代表的字符意義。
舉例:
/http:\/\// /http:\/\//.test("http://www.jnshu.com") // true
量詞
正則表達式的量詞分別是貪婪,惰性,支配性:
- 貪婪量詞:先看整個字符串是不是一個匹配。如果沒有發(fā)現(xiàn)匹配, 它去掉最后字符串中的最后一個字符,并再次嘗試。
- 惰性量詞: 先看字符串中的第一個字母是不是一個匹配。如果單獨 這一個字符還不夠,就讀入下一個字符,組成兩個字符的字符串。 如果還是沒有發(fā)現(xiàn)匹配,惰性量詞繼續(xù)從字符串添加字符 直到發(fā)現(xiàn)一個匹配或者整個字符串都檢查過也沒有匹配。
- 支配量詞:只嘗試匹配整個字符串。如果整個字符串不能產(chǎn)生匹配,不做 進一步嘗試,支配量詞其實簡單的說,就是一刀切。
惰性量詞和貪婪量詞的工作方式正好是相反的。
表示這3種量詞:
貪 婪 惰 性 支 配 描 述
? ?? ?+ 零次或一次出現(xiàn)
* *? *+ 零次或多次出現(xiàn)
+ +? ++ 一次或多次出現(xiàn)
{n} {n}? {n}+ 恰好n次出現(xiàn)
{n,m} {n,m}? {n,m}+ 至少n次,最多m次出現(xiàn)
{n,} {n,}? {n,}+ 至少n次出現(xiàn)
舉例:
/\d*/.test("abc") // true 數(shù)字可以出現(xiàn)0次到無窮次,所以是對的
/\d+/.test("abc") // false 數(shù)字至少出現(xiàn)1次到無窮次,所以是錯的
/\d+/.test("1abc") // true 數(shù)字至少出現(xiàn)1次到無窮次,所以是對的
/https?:/.test("http://www.jnshu.com") // true s可以出現(xiàn)0次到1次,所以是對的
/https?:/.test("https://www.jnshu.com") // true
/https?:/.test("httpss://www.jnshu.com") // false s后面是:所以是錯的
貪婪匹配原則
在JavaScript中,正則表達式進行匹配時默認使用的是貪婪匹配原則,即盡可能多的匹配字符串。例如,使用正則表達式/1{3,4}/來匹配字符串1111111,得到的結(jié)果為:1111和111。即先匹配4個字符,然后才匹配3個字符。
3.常見問題
如何利用正則表達式獲取URL中各部分的值?
4.解決方案
捕獲
保存匹配到的字符串,日后再用
() :捕獲 /(jnshu)/
(?:) :不捕獲 /(?:jnshu)/
url由協(xié)議、主機、端口、路徑、搜索、哈希值組成
http://www.jnshu.com:8080/index.html?user=chenapo&age=99#home
| | | | | |
protocol | | | | |
hostname port | | |
\ / pathname search hash
host

5.編碼實戰(zhàn)
6.擴展思考
常用正則表達式有哪些?
PS:給出的這篇教程中某些正則表達式是錯誤,大家使用時測試一下。
7.參考文獻
參考文獻:
菜鳥教程
正則表達式的量詞解釋
8.更多討論
問題1:正則表達式最常用的應(yīng)用場景?
答:總體來說,正則表達式有三類主要應(yīng)用:
(1)測試字符串的某個模式。例如,可以輸入一個字符串進行測試看該字符串中是否存在一個電話號碼模式或者一個信用卡模式,這成為數(shù)據(jù)的有效性檢驗。
(2)替換文本。可以再文檔中使用一個正則表達式來表示特定文字,然后可以將其全部刪除或者替換成別的文字。
(3)根據(jù)模式匹配從字符串中提取一個子字符串??梢杂脕碓谖谋净蛘咻斎胱侄沃胁檎姨囟ǖ奈淖?。
一個正則表達式就是由普通字符(例如字符 a 到 z)以及特殊字符(稱為元字符)組成的文字模式。該模式描述在查找文字主體時待匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。
問題2:var a=/Android/,在這里//代表什么?
答:在正則表達式中,/順斜杠是表示表達式的開始和結(jié)束的“定界符”。
問題3:正則表達式中還有什么其他方法?
