正則表達式-理論基礎篇

正則表達式-理論基礎篇

搬運自我的博客,原址正則表達式-理論基礎篇javascript

  • 什麼是正則表達式?
    能夠稱做規則一個描述字符模式的對象,正則表達式中的字母和數字,都是按照字面含義進行匹配的。強大的字符串匹配工具java

  • 如何創建一個正則表達式?git

  1. 使用RegExp()構造函數來建立RegExp對象github

  2. 特殊的直接量語法來建立,定義爲包含在一對斜槓(/)之間的字符正則表達式

例:var reg = /s$/; , var reg = new RegExp(s$);
二者效果徹底相同,用來匹配全部以字母「s」結尾的字符串。數組

「文本模式」的正則表達式語法

1.直接量字符

非字母的字符匹配,這些字符須要經過反斜線(\)做前綴進行轉義.函數

字 符 匹 配
字母和數字字符 自身
\o NUL字符
\t 製表符
\n 換行符
\v 垂直製表符
\f 換頁符
\r 回車符
\xnn 由十六進制數nn指定的拉丁字符,例:\x0A等價於\n
\uxxxx 由十六進制數xxxx指定的unicode字符,例:\u0009等價於\t
\cX 控制字符^X,例:\cJ等價於換行符\n
  • 具備特殊含義的標點符號:工具

^, $, ., *, +, ?, =, !, :, |, \, /,(,),[,],{, } post

想在正則表達式中使用這些字符的直接量進行匹配,則必須使用前綴"\",其餘標點符號(好比@和引號)無特殊含義,在正則表達式中按照字面含義進行匹配。編碼

2.字符類.

方括號,或,範圍

將直接量字符單獨放進方括號內就組成了字符類。一個字符類能夠匹配它包含的任意字符。字符類可使用連字符來表示字符範圍。

字 符 含 義
[...] 方括號內的任意字符
[^...] 不在方括號內的任意字符
. 除換行符合其餘unicode行終止符以外的任意字符
\w 任何ASCII符組成的的單詞,等同[a-zA-Z0-9]
\W 任何不是ASCII符組成的的單詞,等同[^a-zA-Z0-9]
\s 任何unicode空白字符
\S 任何非unicode空白符的字符,注意\W\s不一樣
\d 任何ASCII數字等價於[0-9]
\D 除了ASCII數字以外的任何字符,等價於[^0-9]
[\b] 退格直接量(特例)
  • 例:

    • /[a,b,c]/:表示和字母"a","b","c"中的任意一個都匹配

    • /[a-z]/:匹配拉丁字母表中的小寫字母

    • /[/s/d]/:匹配任意空白符或數字

3. 重複

用以指定字符重複的標記

字 符 含 義
{n,m} 匹配前一項至少n次,但不能超過m次
{n,} 匹配前一項n次或者更屢次
{n} 匹配前一項n次
? 匹配前一項0次或者1次(也就是前一項是可選的,等價於{0,1})
+ 匹配前一項1次或者屢次(等價於{1,})
* 匹配前一項0次或者屢次,等價於{0,}
  • 例:

    • /\d{2,4}/:匹配2-4個數字。

    • /\w{3}\d?/:精確匹配三個單詞和一個可選的數字。

    • /\s+java\s+/:匹配先後有1個或多個空格的字符串"java"

    • /[^(]*/:匹配0個或多個非左括號的字符(這裏實際上能與"("匹配)

  • 在使用"*",和"?"時要注意,因爲這些字符能匹配0個字符,所以它們容許什麼都不匹配,例:

    • /a*/能匹配字符串"bbbb",因其含有0個a。

  • 上表中列出的匹配字符爲"貪婪的"匹配,它老是儘量多地匹配,且容許後續的正則表達式繼續匹配。

  • 非貪婪匹配,只需在待匹配的字符後跟隨一個問號便可,"?",+?,*?{1,5}?。例:

    • /a+/:匹配"aaa"時,三個字符都被匹配,

    • /a+?/:匹配"aaa"時,因其儘量少的匹配,只能匹配第一個a

4.選擇-分組和引用

包括:指定選擇項,自表達式分組,和引用前一子表達式的特殊字符

  • 選擇項的嘗試匹配次序是從左到右,直到發現匹配項,若左邊成功匹配就忽略右邊的項。

  • 正則表達式中圓括號的做用:

    1. 把單獨的項組成子表達式,以便於能夠像處理獨立單元同樣,用\|,*,+或者?等等來對單元內的項進行處理

    2. 在完整的模式中定義子模式

    3. 容許在同一正則表達式的後部,引用前面的子表達式

字 符 含 義
"|" "|"選擇,匹配的是該符號左邊的子表達式或右邊的子表達式
(...) 組合,將幾個項組合成爲一個單元,這個單元可經過"|",*,+或者?等符號,加以修飾,並且能夠記住和這個相匹配的字符串以供之後的引用使用
(?:..) 只組合,把項組合到一個單元,但不記憶與該組相匹配的字符
\n 和第n個分組第一次匹配的字符相匹配,組是圓括號中的子表達式(也有可能嵌套的),組索引是從左到右的左括號數,"(?:形式的分組不編碼"
  • 例:

    • /ab|cd|ef/:能夠匹配"ab",也能夠匹配"cd",還能夠匹配"ef".

    • /\d{3}|[a-z]{4}/:能夠匹配3個數字,或者4個小寫字母.

    • (/[a-z]+(\d+)/):匹配一個或多個小寫字母后跟隨了一位或多位數字,使用括號包裹後,能夠從檢索到的匹配中抽取數字了.

5.指定匹配位置

咱們稱這些元素爲正則表達式的錨,它們將模式定位在搜索字符串的特定位置上.

字 符 含 義
^ 匹配字符串的開頭,在多行檢索中,匹配一行的開頭
$ 匹配字符串的結尾,在多行檢索中,匹配一行的結尾
\b 匹配一個單詞邊界,簡言之,就是位於字符\w和\W之間的位置,或位於字符\w和字符串的開頭或結尾之間的位置(須要注意:[\b]匹配的是退格符)
\B 匹配非單詞邊界的位置
  • 例:

    • /^JavaScript$/:匹配"JavaScript"單詞

    • /\B[Ss]cript/:與"JavaScript"和"/postscript"匹配,但不與"script"與"Script".

6.修飾符

說明高級匹配的規則,放在"/"符號以外,第二條斜線後

字 符 含 義
i 執行不區分大小寫的匹配
g 執行一個全局匹配,簡言之,就是要找到全部的匹配,而不是在找到一個以後就中止
m 多行匹配模式,^匹配一行的開頭和字符串的開頭,$匹配行的結束和字符串的結束
  • 例:

    • /java$/im:能夠匹配"java"也能夠匹配"Java\nis fun"

用於模式匹配的string方法

正則表達式的做用就是用來解析字符串

1. search():

  • 查找字符串,接受一個參數爲正則表達式,返回返回一個與之匹配的子串的起始位置,若未找到返回-1.

  • 例: JavaScript.search(/script/i);//返回4

  • search()方法不支持全局屬性檢索,因此會忽略修飾符g

2. replace():

  • 用以執行檢索與替換操做,接受兩個參數,第一個參數是一個正則,第二個是要進行替換的字符串

  • 若第一個參數是字符串,replace()則會直接搜索這個字符串

  • 若替換字符串中出現了$加數字,那麼replace()將用與指定的子表達式相匹配的文原本替換這兩個字符.

例:

text.replace(/javascript/gi,"JavaScript");//將全部不區分大小寫的javascript都替換成,大小寫正確的JavaScript.

//一段引用文本起始於引號,結束與引號.
//中間的內容區域,不能包含引號
var quote = /"([^"]*)"/g;
//引用中文半角引號替換英文引號,同時要保持引號之間的內容(儲存在$1中)沒有被修改.
text.replace(quote,'「$1」');

3. match()

  • 接受惟一一個參數,就是正則表達式,返回的是一個由匹配結果組成的數組.例:

    • "1 plus 2 equals 3".match(/\d+/g);//返回["1","2","3"]

  • 若在這個正則表達式中沒有設置修飾符g,match()就不會進行全局檢索,它只檢索第一個匹配。但即便match()執行的不是全局檢索,它也返回一個數組。在這種狀況下,數組的第一個元素就是匹配的字符串,餘下的元素則是正則表達式中用圓括號括起來的子表達式。

  • 所以,若是macth()返回一個數組a,那麼a[0]存放的是完整的匹配,a[1]存放的是與第一個圓括號括起來的表達式相匹配的子串,以此類推。爲了和方法replace()保持之後,a[n]存放的是$n的內容。

  • 例:解析一個url

var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
var text = "Visit my blog at http://www.example.com/~david";

var result = text.match(url);

if (result != null) {
    var fullurl = result[0]; //包含 "http://www.example.com/"
    var protocol = result[1]; //包含 "http"
    var host = result[2]; //包含 "www.example.com"
    var path = result[3]; //包含~david
}

4. split()

  • 用以將調用它的字符串拆分爲子串組成的數組,使用分隔符是split()的參數

  • 參數爲字符串

    • "123,456,789".split(",");//返回["123","456","789"]

  • 參數爲正則

    • "1,2, 3,4 ,5".split(/\s*,\s*/)//返回["1","2"," 3","4 ","5"]

    • 指定分隔符",",容許兩邊能夠留有任意多的空白符

RegExp對象

  • RegExp對象用以建立新的RegExp對象,可接受兩個參數,第二個可選.

  • RegExp對象的第一個參數爲正則表達式的主體部分,也就是/...../之間的文本,不管是字符串直接量,仍是正則表達式都使用"\"做爲轉義字符的前綴.

  • 第二個可選參數爲指定正則表達式的修飾符,i,g,m或者他們的組合.參考:文本模式的則表達式-修飾符
    例:

var reg = new RegExp("\\d{5}","g");//匹配全局模式下的5個數字
alert(reg.test("1J2a35786"));//true
alert(reg.test("1J2a356"));//false

RegExp屬性

屬性名 類型 含義
source 只讀字符串 包含正則表達式的文本
global 只讀布爾值 用以說明正則表達式是否帶有修飾g
ignoreCase 只讀布爾值 用以說明正則表達式是否帶有修飾i
multiline 只讀布爾值 用以說明正則表達式是否帶有修飾m
lastIndex 可讀性的整數 若匹配模式中含有g,這個屬性儲存在整個字符串中下一次檢索的開始位置
相關文章
相關標籤/搜索