摘要:正則表達式是由普通字符例如字符到以及特殊字符稱為元字符組成的文字模式。方法參數一個正則表達式對象。如果正則表達式沒有標志,則會返回和相同的結果。其被視為一整個字符串,而不是一個正則表達式。
正則表達式
正則表達式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為"元字符")。
正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串。
通過使用正則表達式,可以:
測試字符串內的模式。
例如,可以測試輸入字符串,以查看字符串內是否出現電話號碼模式或信用卡號碼模式。這稱為數據驗證。
替換文本。
可以使用正則表達式來識別文檔中的特定文本,完全刪除該文本或者用其他文本替換它。
基于模式匹配從字符串中提取子字符串。
可以查找文檔內或輸入域內特定的文本。
目前,正則表達式已經在很多軟件中得到廣泛的應用,包括 *nix(Linux, Unix等)、HP 等操作系統,PHP、C#、Java 等開發環境,以及很多的應用軟件中,都可以看到正則表達式的影子。
特殊字符(稱為"元字符")正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。
構造正則表達式的方法和創建數學表達式的方法一樣。也就是用多種元字符與運算符可以將小的表達式結合在一起來創建更大的表達式。正則表達式的組件可以是單個的字符、字符集合、字符范圍、字符間的選擇或者所有這些組件的任意組合。
正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為"元字符")組成的文字模式。模式描述在搜索文本時要匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。
而往往正則的使用,那些元字符才是最為重要的部分,但是元字符真的不少,所以想要強記真的不容易,但是還是有一些使用場景較多的需要注意;
字符類別
反斜杠
將下一個字符標記為一個特殊字符、或一個原義字符、或一個 向后引用、或一個八進制轉義符。例如,"n" 匹配字符 "n"。"n" 匹配一個換行符。序列 "" 匹配 "" 而 "(" 則匹配 "("。
. 點號,
匹配任意單個字符, 但是行結束符除外:n r u2028 或 u2029。
d
匹配任一阿拉伯數字,等價于[0-9]
D
匹配任意一個不是阿拉伯數字的字符。等價于1
w
匹配任意來自基本拉丁字母表中的字母數字字符,還包括下劃線。等價于 [A-Za-z0-9_]。
W
匹配任意不是基本拉丁字母表中單詞(字母數字下劃線)字符的字符。等價于 2。
s
匹配一個空白符,包括空格、制表符、換頁符、換行符和其他 Unicode 空格。 等價于 [ fnrtv?u00a0u1680?u180eu2000?u2001u2002?u2003u2004? u2005u2006?u2007u2008?u2009u200a?u2028u2029??u202fu205f? u3000]。
[]
匹配一個退格符(backspace)(不要與 邊界匹配混淆)
S
匹配一個非空白符
uhhhh
匹配 Unicode 值為 hhhh (四個十六進制數字)的字符。
字符集合
[xyz]
一個字符集合,也叫字符組。匹配集合中的任意一個字符。你可以使用連字符"-"指定一個范圍。
[^xyz]
一個反義或補充字符集,也叫反義字符組。也就是說,它匹配任意不在括號內的字符。你也可以通過使用連字符 "-" 指定一個范圍內的字符。
邊界
^
匹配輸入開始。如果多行(multiline)標志被設為 true,該字符也會匹配一個斷行(line break)符后的開始處。
$
匹配輸入結尾。如果多行(multiline)標志被設為 true,該字符也會匹配一個斷行(line break)符的前的結尾處。
匹配一個零寬單詞邊界(zero-width word boundary),如一個字母與一個空格之間。 (不要和 [b] 混淆)
B
匹配一個零寬非單詞邊界(zero-width non-word boundary),如兩個字母之間或兩個空格之間。
分組(grouping)與反向引用(back references)
(x) 括號包括內容
匹配 x 并且捕獲匹配項。 這被稱為捕獲括號(capturing parentheses)。例如,/(foo)/ 匹配且捕獲 "foo bar." 中的 "foo"。被匹配的子字符串可以在結果數組的元素 [1], ..., [n] 中找到,或在被定義的 RegExp 對象的屬性 $1, ..., $9 中找到。捕獲組(Capturing groups)有性能懲罰。如果不需再次訪問被匹配的子字符串,最好使用非捕獲括號(non-capturing parentheses),見下面的(?:x)。
其中n 是一個正整數。一個反向引用(back reference),指向正則表達式中第 n 個括號(從左開始數)中匹配的子字符串。例如,/apple(,)sorange1/ 匹配 "apple, orange, cherry, peach." 中的 "apple,orange,"。一個更全面的例子在該表格下面。
(?:x)
匹配 x 不會捕獲匹配項。這被稱為非捕獲括號(non-capturing parentheses)。匹配項不能夠從結果數組的元素 [1], ..., [n] 或已被定義的 RegExp 對象的屬性 $1, ..., $9 再次訪問到。
數量詞(Quantifiers)
x*
匹配前面的模式 x 0 或多次。
x+
匹配前面的模式 x 1 或多次。等價于 {1,}。
x*? x+?
像上面的 * 和 + 一樣匹配前面的模式 x,然而匹配是最小可能匹配。這是非貪婪匹配的寫法,主要是在量詞(* +)后面添加?來非貪婪匹配
x?
匹配前面的模式 x 0 或 1 次。
x(?=y)
只有當 x 后面緊跟著 y 時,才匹配 x【其中y是不算匹配結果的】。 例如,/Jack(?=Sprat)/ 只有在 "Jack" 后面緊跟著 "Sprat" 時,才會匹配它。/Jack(?=Sprat|Frost)/ 只有在 "Jack" 后面緊跟著 "Sprat" 或 "Frost" 時,才會匹配它。然而,"Sprat" 或 "Frost" 都不是匹配結果的一部分。
x(?!y)
只有當 x 后面不是緊跟著 y 時,才匹配 x。例如,/d+(?!.)/ 只有當一個數字后面沒有緊跟著一個小數點時,才會匹配該數字。/d+(?!.)/.exec("3.141") 匹配 141 而不是 3.141。
x|y
匹配 x 或 y
x{n}
是一個正整數。前面的模式 x 連續出現 n 次時匹配。
x{n,}
是一個正整數。前面的模式 x 連續出現至少 n 次時匹配。
x{n,m}
和 m 為正整數。前面的模式 x 連續出現至少 n 次,至多 m 次時匹配。
斷言(Assertions)
x(?=y)
僅匹配被y跟隨的x。舉個例子,/Jack(?=Sprat)/,如果"Jack"后面跟著sprat,則匹配之。/Jack(?=Sprat|Frost)/ ,如果"Jack"后面跟著"Sprat"或者"Frost",則匹配之。但是,"Sprat" 和"Frost" 都不會在匹配結果中出現。
x(?!y)
僅匹配不被y跟隨的x。舉個例子,/d+(?!.)/ 只會匹配不被點(.)跟隨的數字。/d+(?!.)/.exec("3.141") 匹配"141",而不是"3.141"
正則表達式是用于匹配字符串中字符組合的模式。在 JavaScript中,正則表達式也是對象。這些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、replace、search 和 split 方法。本章介紹 JavaScript正則表達式。
構建var patt=new RegExp(pattern,modifiers); 或者更簡單的方式: var patt=/pattern/modifiers; //pattern(模式) 描述了表達式的模式 //modifiers(修飾符) 用于指定全局匹配g、區分大小寫i的匹配和多行匹配m、Unicode序列u、粘性匹配y
有兩種方法來創建一個RegExp對象:一是字面量、二是構造函數。要指示字符串,字面量的參數不使用引號,而構造函數的參數使用引號
當使用構造函數創造正則對象時,需要常規的字符轉義規則(在前面加反斜杠 ),下面兩個等價
var re = new RegExp("w+"); var re = /w+/;屬性
RegExp.length 值為2
RegExp.prototype.global
是否開啟全局匹配,也就是匹配目標字符串中所有可能的匹配項,而不是只進行第一次匹配。
RegExp.prototype.ignoreCase
在匹配字符串時是否要忽略字符的大小寫。
RegExp.prototype.lastIndex
下次匹配開始的字符串索引位置。
RegExp.prototype.multiline
是否開啟多行模式匹配(影響 ^ 和 $ 的行為)。
RegExp.prototype.source
正則對象的源模式文本。
RegExp.prototype.sticky
是否開啟粘滯匹配。
在目標字符串中執行一次正則匹配操作。如果匹配成功,exec() 方法返回一個數組,并更新正則表達式對象的屬性。返回的數組將完全匹配成功的文本作為第一項,將正則括號里匹配成功的作為數組填充到后面。如果匹配失敗,exec() 方法返回 null。
當正則表達式使用 "g" 標志時,可以多次執行 exec 方法來查找同一個字符串中的成功匹配。當你這樣做時,查找將從正則表達式的 lastIndex 屬性指定的位置開始。(test() 也會更新 lastIndex 屬性)
var myRe = /ab*/g; var str = "abbcdefabh"; var myArray; while ((myArray = myRe.exec(str)) !== null) { var msg = "Found " + myArray[0] + ". "; msg += "Next match starts at " + myRe.lastIndex; console.log(msg); }
使用了g代表可以多次運行,運行exec返回的結果myArray[0]是匹配的全部字符串,myArray[1], ...[n ] 匹配的是括號中的分組捕獲,myArray是數組,但是還有index屬性,匹配到的字符位于原始字符串的基于0的索引值 ;以及input屬性,匹配的是原始字符串。
myRe.exec()每運行完了一次之后,myRe也會發生變化,主要是屬性lastIndex的變化,下一次運行myRe.exec()都可以從這個更新的lastIndex處開始匹配;
2. RegExp.prototype.test(str)注意:不要把正則表達式字面量(或者RegExp構造器)放在 while 條件表達式里。由于每次迭代時 lastIndex的屬性都被重置,如果匹配,將會造成一個死循環。并且要確保使用了"g"標記來進行全局的匹配,否則同樣會造成死循環。
如果你只是為了判斷是否匹配(true或 false),可以使用 RegExp.test() 方法,或者 String.search() 方法。
測試當前正則是否能匹配目標字符串。test() 方法執行一個檢索,用來查看正則表達式與指定的字符串是否匹配。返回 true 或 false。
/^cwj(god)+/.test("cwjgod"); //trueJavaScript中的string和正則結合使用
String的match、replace、search和split方法都可以使用正則表達式。
match方法str.match(regexp);
參數:
一個正則表達式對象。如果傳入一個非正則表達式對象,則會隱式地使用 new RegExp(obj) 將其轉換為一個 RegExp 。如果你未提供任何參數,直接使用 match() ,那么你會得到一個包含空字符串的 Array :[""] 。
當參數是一個字符串或一個數字,它會使用new RegExp(obj)來隱式轉換成一個 RegExp。如果它是一個有正號的正數,RegExp() 方法將忽略正號。
返回值:
一個包含了整個匹配結果以及任何括號捕獲的匹配結果的 Array ;如果沒有匹配項,則返回 null 。
如果正則表達式沒有 g 標志,則 str.match() 會返回和 RegExp.exec() 相同的結果。而且返回的 Array 擁有一個額外的 input 屬性,該屬性包含被解析的原始字符串。另外,還擁有一個 index 屬性,該屬性表示匹配結果在原字符串中的索引(以0開始為整個匹配,1...n后面就是()括號里面的子匹配)。
replace方法這是一個強大的方法,
str.replace(regexp|substr, newSubStr|function)
參數1:以下二選一
regexp (pattern)
一個RegExp 對象或者其字面量。該正則所匹配的內容會被第二個參數的返回值替換掉。
substr (pattern)
一個要被 newSubStr 替換的字符串。其被視為一整個字符串,而不是一個正則表達式。僅僅是第一個匹配會被替換。
參數二:以下二選一
newSubStr (replacement)
用于替換掉第一個參數在原字符串中的匹配部分的字符串。該字符串中可以內插一些特殊的變量名。參考下面的使用字符串作為參數。
function (replacement)
一個用來創建新子字符串的函數,該函數的返回值將替換掉第一個參數匹配到的結果。參考下面的指定一個函數作為參數。
在第一個參數是字符串的時候,第二個字符串可以是字符串或者是函數:
第二個參數是字符串
會有以下幾種特殊字符的存在,
$$ 代表插入一個 "$"。 $& 代表插入匹配的子串。 $` 代表插入當前匹配的子串左邊的內容。 $" 代表插入當前匹配的子串右邊的內容。
第二個參數是函數
函數的返回值作為替換字符串,參數match是匹配的子字符串
在第一個參數是正則表達式的時候,第二個參數可以是字符串或者函數
第二個參數是字符串
$$ 代表插入一個 "$"。 $& 代表插入匹配的子串。 $` 代表插入當前匹配的子串左邊的內容。 $" 代表插入當前匹配的子串右邊的內容。 $n n 是個小于100的非負整數,那么$n就代表第 n 個括號匹配的字符串
第二個參數是函數
函數的返回值作為替換字符串,參數如下:
1.參數match是匹配的子字符串 2.參數【p1, p2,...】[$1, $2,...] 代表第n個括號匹配的字符串 3.offset 匹配到的子字符串在原字符串中的偏移量 4.string 被匹配的原字符串。
這個參數順序是固定的,不能跳著寫,也就是說如果你需要offset,那么必須把第一個參數在的全部匹配match以及所有的()子匹配都列出來在參數中,才能正確的映射到所有參數上
search方法str.search(regexp)
參數
一個正則表達式(regular expression)對象。如果傳入一個非正則表達式對象,則會使用 new RegExp(obj) 隱式地將其轉換為正則表達式對象。
返回值
如果匹配成功,則 search() 返回正則表達式在字符串中首次匹配項的索引。否則,返回 -1。
str.split([separator[, limit]])
split() 方法使用指定的分隔符字符串將一個String對象分割成字符串數組,以將字符串分隔為子字符串,以確定每個拆分的位置。
兩個參數
separator
指定表示每個拆分應發生的點的字符串。separator 可以是一個字符串或正則表達式。 如果純文本分隔符包含多個字符,則必須找到整個字符串來表示分割點。如果在str中省略或不出現分隔符,則返回的數組包含一個由整個字符串組成的元素。如果分隔符為空字符串,則將str原字符串中每個字符的數組形式返回。
limit
一個整數,限定返回的分割片段數量。當提供此參數時,split 方法會在指定分隔符的每次出現時分割該字符串,但在限制條目已放入數組時停止。如果在達到指定限制之前達到字符串的末尾,它可能仍然包含少于限制的條目。新數組中不返回剩下的文本。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89223.html
摘要:選擇分組和引用正則表達式的語法還包括指定選擇項子表達式分組和引用前一子表達式的特殊字符。帶圓括號的表達式的另一個用途是允許在同一正則表達式的后部引用前面的子表達式。 正則表達式(regular expression)是一個描述字符模式的對象。JavaScript的 RegExp類 表示正則表達式,String和RegExp都定義了方法,后者使用正則表達式進 行強大的模式匹配和文本檢索與...
摘要:如果遇到非常的復雜的匹配,正則表達式的優勢就更加明顯了。關于正則表達式書寫規則,可查看,上面說的很清楚了,我就不貼出來了。替換與正則表達式匹配的子串,并返回替換后的字符串。結語正則表達式并不難,懂了其中的套路之后,一切都變得簡單了。 前言 在正文開始前,先說說正則表達式是什么,為什么要用正則表達式?正則表達式在我個人看來就是一個瀏覽器可以識別的規則,有了這個規則,瀏覽器就可以幫我們判斷...
摘要:正則表達式的意義中的正則表達式使用表示,可以使用構造函數來創建對象,不過對象更多的是通過一種特殊的直接量語法來創建。用構造函數也可以定義一個與之等價的正則表達式,代碼如下正則表達式的模式規則是由一個字符序列組成的。 正則表達式的模式匹配 正則表達式(regular expression)是一個描述字符模式的對象。javascript的RegExp對象表示正則表達式,String和Reg...
Javascript的正則表達式是前端中比較重要的部分,正則表達式主要用于字符串處理,表單驗證等場合,實用高效,文章主要對JavaScript中的正則的學習與總結 正則表達式的定義 正則表達式:是一個描述字符模式的對象,JavaScrip中正則表達式用RegExp對象表示,可以使用RegExp構造函數來創建正則對象 正則表達式的創建 1.字面量創建 var reg = /[a-z]/; 2.構...
摘要:返回是一個只讀的布爾值,看這個正則表達式是否帶有修飾符。方法,它的參數是一個字符串,用對某個字符串進行檢測,如果包含正則表達式的一個匹配結果,則返回,否則返回??偨Y這次主要是說說,中正則表達式對象的個屬性,而最需要注意的就是屬性了。 說明 這篇文章,主要和大家聊聊JavaScript中RegExp對象的屬性。 解釋 每個RegExp對象都包含5個屬性,source、global、ign...
閱讀 3066·2023-04-25 18:54
閱讀 2591·2021-11-02 14:40
閱讀 3176·2021-09-23 11:58
閱讀 2424·2019-08-30 13:50
閱讀 1231·2019-08-29 12:46
閱讀 3117·2019-08-28 17:51
閱讀 679·2019-08-26 11:47
閱讀 897·2019-08-23 16:17