正規表示式是用正規表示式語言建立的,正規表示式語言並不是一種完備的程式語言,它甚至算不上是一種能夠直接安裝並執行的程式。更準確地說,正規表示式語言是內置於其他語言或軟體產品的「迷你」語言。正規表示式語言雖然也被稱為一種語言,但它與人們對語言的印象相去甚遠。
正規表示式經常被簡稱為模式
。
js中的正規表示式用regexp
物件表示,有兩種方式建立regexp
物件。
一種是通過一種特殊的直接量語法建立
var pattern = /s$/
另一種是使用regexp()
建構函式
var pattern = new regexp('s$')
如果需要修飾符
var pattern = /s$/i
var pattern = new regexp('s$', 'i')
js中的正規表示式還是比較弱的,比如不支援後行斷言,不支援嵌入條件。
直接量字元包括字面含義的字母和數字、非字母的字元、和一些具有特殊含義的字元,後面兩種需要轉義。
字元匹配
字母和數字
自身\o
nul字元(\u0000)
\t製表符(\u0009)
\n換行符(\u000a)
\v垂直製表符(\u000b)
\f換頁符(\u000c)
\r回車符(\u000d)
\xnn
由十六進製制數nn指定的拉丁字元,例如,\x0a等價於\n
\u***x
由十六進製制數***x指定的unicode字元,例如\u0009等價於\t
\cx控制字元^x,例如,\cj等價於換行符\n
windows使用\r\n
表示文字行結束,unix、linux只使用\n
表示文字結束。
一些具有特殊含義的字元也需要轉義,如下
^ $ . * + ? = ! : | \ / ( ) [ ]
將直接量字元單獨放進方括號內就組成了字元類,乙個字元類可以匹配它所包含的任意字元。由於某些字元類非常常用,因些在js的正規表示式語法中,使用了特定字元的轉義字元來表示它們。
字元匹配
[…]方括號內的任意字元
[^…]
不在方括號內的任意字元
.除換行符和其他unicode行終止符之外的任意字元
\w任何ascii字元組成的單詞,等價於[a-za-z0-9]
\w任何不是ascii字元組成的單詞,等價於[^a-za-z0-9]
\s任何unicode空白符
\s任何非unicode空白符
\d任何ascii數字,等價於[0-9]
\d任何非ascii數字,等價於[^0-9]
[\b]
退格直接量(特例)
字元匹配
?等價於
+等價於
*等價於
預設情況下,正規表示式會盡可能多地匹配(貪婪模式),只需要在重複字元後面新增問號?
就可以進行非貪婪模式,如??
、+?
、*?
、?
。
需要注意的是,不管是貪婪模式還是非貪婪模式,正規表示式總是會尋找字串中第乙個可能匹配的位置,如,對於字串aaabb
,/a+b/
會匹配aaabb
,/a+?b/
會匹配aaab
而不是子串中更短的ab
。
選擇項的嘗試匹配次序是從左到右,直到發現了匹配項,如果左邊的選擇項匹配,就忽略右邊的匹配項,如字串ab
,/a|ab/
匹配的是a
。
字元匹配
|匹配的是該符號左邊的子表示式或右邊的子表示式
分組形成子表示式。
字元匹配
(…)(^…)
只分組,不編號,即不能被引用
\n回溯引用
回溯引用(backreference)允許正規表示式模式引用前面的匹配結果。
字元匹配
^字串的開頭
$字串的結尾
\b單詞的邊界
\b非單詞邊界的位置
(?=p)
正向先行斷言,要求接下來的字元都與p匹配,但匹配的結果不包括p
(?!p)
負向先行斷言,要求接下來的字元都不與p匹
錨字元是匹配位置的,不匹配任何字元,比如對於字串abc
,a(?=b)bc
可以匹配,但是a(?=b)c
不匹配。
js支援三個修飾符。
字元匹配ig
執行乙個全域性匹配,即找到所有的匹配,而不是在找到乙個之後就停止
m多行匹配模式,^匹配一行的開頭和字串的開頭,$匹配一行結尾和字串的結尾
regexp物件有5個屬性和2個方法:
5個屬性
source
唯讀,正規表示式的文字
global
唯讀,是否帶有修改符g
ignorecase
唯讀,是否帶有修改符i
multiline
唯讀,是否帶有修改符m
lastindex
可讀/寫,如果匹配模式帶有g,這個屬性儲存整個字串下一次檢索的開始位置
2個方法
exec()
如果沒有找到任何匹配,則返回null,否則返回乙個陣列,第乙個元素包含的是與正規表示式相匹配的字串,餘下的元素是與圓括號內的子表示式相匹配的子串。
會忽略g。
test()
如果匹配則返回true
(1) search
(2) replace
如果replace()的第乙個引數是字串而不是正規表示式,則將直接搜尋這個字串;
如果不帶g
,則只匹配一次;
第二個引數可以是$加數字
,代表對應的子串。
(3) match
如果沒有g
,則返回結果和exec()
一樣
var pattern = /h(i)/
var str = 'ahibchhidefhiig'
console.log(str.match(pattern)) // ["hi", "i", index: 1, input: "ahibchhidefhiig"]
如果有g
,則返回所有的匹配,但不包括子表示式
// 如果有`g`,則返回所有的匹配,但不包括子串
var pattern = /h(i)/g
var str = 'ahibchhidefhiig'
console.log(str.match(pattern)) // ["hi", "hi", "hi"]
(4) split
console.log('123,456,789'.split(',')) // ["123", "456", "789"]
// 好像會忽略`g`
console.log('123, 456 , 789'.split(/\s*,\s*/)) // ["123", "456", "789"]
js中的正規表示式
d 非負整數 正整數 0 0 9 1 9 0 9 正整數 d 0 非正整數 負整數 0 0 9 1 9 0 9 負整數 d 整數 d d 非負浮點數 正浮點數 0 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 正浮點數 d d 0 0 非正浮點數 負浮點數 ...
JS中的正規表示式
在電腦科學中,是指乙個用來描述或者匹配一系列符合某個語法規則的字串的單個字串。在很多文字編輯器或其他工具裡,正規表示式通常被用來檢索或替換那些符合某個模式的文字內容。正規表示式驗證一系列有規律的表示式 match 和replace replace 方法返回根據正規表示式進行文字替換後的字串的複製。語...
JS中的正規表示式
正規表示式是一種可以用於模式匹配和替換的強有力的工具 1.基本語法 1 元字元 以及 元字元規定其前導字元必須在目標物件中連續出現一次或多次 fo 因為上述正規表示式中包含 元字元,表示可以與目標物件中的 fool fo 或者 football 等在字母f後面連續出現乙個或多個字母o的字串相匹配。元...