再看正則表達式

正則表達式

前言

平時js編碼時,對字符串的操做隨處可見。正則表達式即是一種用來匹配字符串的一把利劍。它的設計思想是用一種描述性的語言來給字符串定義一個規則,凡是符合規則的字符串,咱們就認爲它「匹配」了。若是您是一位老司機,那麼正則表達式確定耳熟能詳,可是若是您是剛上車的話,那麼我們就接下來探討探討。正則表達式

爲什麼要使用正則表達式

  • 測試字符串內的模式
  • 替換文本
  • 基於模式匹配從字符串中提取子字符串

正則表達式的建立

主要有下面兩種方式,常常食用的是字面量形式。固然構造函數的更加靈活,能夠根據條件動態生成正則。數組

  • new RegExp(pattern [, flags]) RegExp構造函數建立
  • /pattern/flags 正則字面量建立
  • RegExp(pattern [, flags])
  1. RegExp對象建立函數

    var reg = new RegExp('A+b', g);
    reg.test('saAb')  //true
  2. 字面量測試

    var reg = /A+b/g;
    reg.test('saAb') //true

常見的術語

  • 元字符
元字符 描述
. 查找單個字符,除了換行和行結束符。
w 查找單詞字符。
W 查找非單詞字符。
d 查找數字。
D 查找非數字字符。
s 查找空白字符。
S 查找非空白字符。
b 匹配單詞邊界。
B 匹配非單詞邊界。
0 查找 NUL 字符。
n 查找換行符。
f 查找換頁符。
r 查找回車符。
t 查找製表符。
v 查找垂直製表符。
xxx 查找以八進制數 xxx 規定的字符。
xdd 查找以十六進制數 dd 規定的字符。
uxxxx 查找以十六進制數 xxxx 規定的 Unicode 字符。
  • 量詞
量詞 描述
n+ 匹配任何包含至少一個 n 的字符串。
n+? ?開啓懶惰模式,開啓最小匹配
n* 匹配任何包含零個或多個 n 的字符串。
n*? ?開啓懶惰模式,開啓最小匹配
n? 匹配任何包含零個或一個 n 的字符串。
n{X} 匹配包含 X 個 n 的序列的字符串。
n{X,Y} 匹配包含 X 至 Y 個 n 的序列的字符串。
n{X,} 匹配包含至少 X 個 n 的序列的字符串。
n$ 匹配任何結尾爲 n 的字符串。
^n 匹配任何開頭爲 n 的字符串。
?=n 匹配任何其後緊接指定字符串 n 的字符串。舉個例子,/Jack(?=Sprat)/,若是"Jack"後面跟着sprat,則匹配之。
?!n 匹配任何其後沒有緊接指定字符串 n 的字符串。舉個例子,/d+(?!.)/ 只會匹配不被點(.)跟隨的數字。
  • 特殊字符
特殊字符 描述
$ 匹配輸入字符串的結尾位置。若是設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符自己,請使用 $。
( ) 標記一個子表達式的開始和結束位置。子表達式能夠獲取供之後使用。要匹配這些字符,請使用 ( 和 )。
* 匹配前面的子表達式零次或屢次。要匹配 * 字符,請使用 *。
+ 匹配前面的子表達式一次或屢次。要匹配 + 字符,請使用 +。
. 匹配除換行符 n 以外的任何單字符。要匹配 . ,請使用 . 。
[ 標記一箇中括號表達式的開始。要匹配 [,請使用 [。
? 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 ?。
\ 將下一個字符標記爲或特殊字符、或原義字符、或向後引用、或八進制轉義符。例如, 'n' 匹配字符 'n'。'n' 匹配換行符。序列 '\' 匹配 "",而 '(' 則匹配 "("。
^ 匹配輸入字符串的開始位置,除非在方括號表達式中使用,此時它表示不接受該字符集合。要匹配 ^ 字符自己,請使用 ^。
{ 標記限定符表達式的開始。要匹配 {,請使用 {。
指明兩項之間的一個選擇。要匹配 ,請使用 \
  • 經常使用定位符
定位字符 描述
^ 匹配輸入字符串開始的位置。若是設置了 RegExp 對象的Multiline 屬性,^ 還會與 n 或 r 以後的位置匹配。
$ 匹配輸入字符串結尾的位置。若是設置了 RegExp 對象的 Multiline 屬性,$ 還會與 n 或 r 以前的位置匹配。
b 匹配一個字邊界,即字與空格間的位置。
B 非字邊界匹配。
  • 修飾符
修飾字符 描述
g 執行全局匹配(查找全部匹配而非在找到第一個匹配後中止)。
i 執行對大小寫不敏感的匹配。
m 執行多行匹配。
  • 字符集合 [ ]

方括號用於查找某個範圍內的字符:編碼

字符 含義
[xyz] 一個字符集合,也叫字符組。匹配集合中的任意一個字符。你可使用連字符'-'指定一個範圍。例如,[abcd] 等價於 [a-d],匹配"brisket"中的'b'和"chop"中的'c'。
[^xyz] 一個反義或補充字符集,也叫反義字符組。也就是說,它匹配任意不在括號內的字符。你也能夠經過使用連字符 '-' 指定一個範圍內的字符。例如,1 等價於 2。 第一個匹配的是 "bacon" 中的'o' 和 "chop" 中的 'h'。
  • 分組(子表達式)

描述一個正確的IP地址:/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/。上面便使用了分組功能。.net

一般使用分組的話,匹配子表達式而且會捕獲匹配項。 這被稱爲捕獲括號;有捕獲括號便會有非捕獲括號,下面這種形式便會開啓。(?:x);設計

  • 反向引用

捕獲表達式的一個用法即是,反向引用。code

對一個正則表達式模式或部分模式兩邊添加圓括號將致使相關匹配存儲到一個臨時緩衝區中,所捕獲的每一個子匹配都按照在正則表達式模式中從左到右出現的順序存儲。緩衝區編號從 1 開始,最多可存儲 99 個捕獲的子表達式。每一個緩衝區均可以使用 n 訪問,其中 n 爲一個標識特定緩衝區的一位或兩位十進制數。regexp

例如: \b(\w+)\b\s+\1\b 便會捕獲相鄰的相同單詞。對象

  • 轉義

    若是你想查找元字符自己的話,好比你查找.,或者*,就出現了問題:你沒辦法指定它們,由於它們會被解釋成別的意思。這時你就得使用來取消這些字符的特殊意義。所以,你應該使用.和*。固然,要查找自己,你也得用\\

    deerchao\.net匹配deerchao.net,C:\\Windows匹配C:\Windows

經常使用方法

  • test() 測試當前正則是否能匹配目標字符串。 //返回true ,false

    注意test的不可重複性

  • exec 檢索字符串中指定的值。返回找到的值,並肯定其位置。

    若是 exec() 找到了匹配的文本,則返回一個結果數組。不然,返回 null。此數組的第 0 個元素是與正則表達式相匹配的文本,第 1 個元素是與 RegExpObject 的第 1 個子表達式相匹配的文本(若是有的話),第 2 個元素是與 RegExpObject 的第 2 個子表達式相匹配的文本(若是有的話),以此類推。除了數組元素和 length 屬性以外,exec() 方法還返回兩個屬性。index 屬性聲明的是匹配文本的第一個字符的位置。input 屬性則存放的是被檢索的字符串 string。咱們能夠看得出,在調用非全局的 RegExp 對象的 exec() 方法時,返回的數組與調用方法 String.match() 返回的數組是相同的。

支持正則表達式的string方法

  • search
    stringObject.search(regexp)
    返回值: stringObject 中第一個與 regexp 相匹配的子串的起始位置。沒有找到返回-1.
  • match
    stringObject.match(regexp)
    返回值: 存放匹配結果的數組。該數組的內容依賴於 regexp 是否具備全局標誌 g。
  • replace 方法用於在字符串中用一些字符替換另外一些字符,或替換一個與正則表達式匹配的子串
    stringObject.replace(regexp/substr,replacement)
    返回值: 一個新的字符串,是用 replacement 替換了 regexp 的第一次匹配或全部匹配以後獲得的。
  • split

經常使用正則表達式

  • 校驗數字的表達式

    1. 列表項目
    2. 數字:^[0-9]*$
    3. n位的數字:^d{n}$
    4. 至少n位的數字:^d{n,}$
    5. m-n位的數字:^d{m,n}$
    6. 零和非零開頭的數字:^(0|1-9*)$
    7. 非零開頭的最多帶兩位小數的數字:^(1-9*)+(.[0-9]{1,2})?$
    8. 帶1-2位小數的正數或負數:^(-)?d+(.d{1,2})$
    9. 正數、負數、和小數:^(-|+)?d+(.d+)?$
    10. 有兩位小數的正實數:^[0-9]+(.[0-9]{2})?$
    11. 有1~3位小數的正實數:^[0-9]+(.[0-9]{1,3})?$
    12. 非零的正整數:^[1-9]d$ 或 ^([1-9][0-9]*){1,3}$ 或 ^+?1-9$
    13. 非零的負整數:^-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
    14. 非負整數:^d+$ 或 ^[1-9]\d*|0$
    15. 非正整數:^-[1-9]d*|0$ 或 ^((-\d+)|(0+))$
    16. 非負浮點數:^d+(.d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
    17. 非正浮點數:^((-d+(.d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
    18. 正浮點數:^[1-9]d.d|0.d[1-9]d$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
    19. 負浮點數:^-([1-9]d.d|0.d[1-9]d)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
    20. 浮點數:^(-?d+)(.d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
  • 校驗字符的表達式

    1. 漢字:^[u4e00-u9fa5]{0,}$
    2. 英文和數字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
    3. 長度爲3-20的全部字符:^.{3,20}$
    4. 由26個英文字母組成的字符串:^[A-Za-z]+$
    5. 由26個大寫英文字母組成的字符串:^[A-Z]+$
    6. 由26個小寫英文字母組成的字符串:^[a-z]+$
    7. 由數字和26個英文字母組成的字符串:^[A-Za-z0-9]+$
    8. 由數字、26個英文字母或者下劃線組成的字符串:^w+$ 或 ^\w{3,20}$
    9. 中文、英文、數字包括下劃線:^[u4E00-u9FA5A-Za-z0-9_]+$
    10. 中文、英文、數字但不包括下劃線等符號:^[u4E00-u9FA5A-Za-z0- 9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
    11. 能夠輸入含有^%&',;=?$\"等字符:[^%&',;=?$x22]+
    12. 禁止輸入含有~的字符:[^~\x22]+
  • 特殊需求表達式

    1. Email地址:^w+([-+.]w+)@w+([-.]w+).w+([-.]w+)*$
    2. 域名:a-zA-Z0-9{0,62}(/.a-zA-Z0-9{0,62})+/.?
    3. InternetURL:[a-zA-z]+://3 或 ^http://([w-]+.)+[w-]+(/[w-./?%&=])?$
    4. 手機號碼:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])d{8}$
    5. 電話號碼("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^((d{3,4}-)|d{3.4}-)?d{7,8}$
    6. 國內電話號碼(0511-440522二、021-87888822):d{3}-d{8}|d{4}-d{7}
    7. 電話號碼正則表達式(支持手機號碼,3-4位區號,7-8位直播號碼,1-4位分機號): ((d{11})|^((d{7,8})|(d{4}|d{3})-(d{7,8})|(d{4}|d{3})-(d{7,8})-(d{4}|d{3}|d{2}|d{1})|(d{7,8})-(d{4}|d{3}|d{2}|d{1}))$)
    8. 身份證號(15位、18位數字),最後一位是校驗位,可能爲數字或字符X:(^d{15}$)|(^\d{18}$)|(^d{17}(d|X|x)$)
    9. 賬號是否合法(字母開頭,容許5-16字節,容許字母數字下劃線):^a-zA-Z{4,15}$
    10. 密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線):^[a-zA-Z]w{5,17}$
    11. 強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在8-10之間):^(?=.d)(?=.[a-z])(?=.*[A-Z]).{8,10}$
    12. 日期格式:^d{4}-d{1,2}-d{1,2}
    13. 一年的12個月(01~09和1~12):^(0?[1-9]|1[0-2])$
    14. 一個月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$

  1. abc
  2. a-c
  3. s
相關文章
相關標籤/搜索