正則表達式在js中主要是對字符串進行匹配,常用在輸入驗證方面,如郵箱,手機號等。比起循環的判斷字符串中的每一個字符,正則表達式往往更能節省性能,並起到事半功倍的效果。以下開始js正則的學習之路。
書寫方式:
1.字面量表示:
/ab/i ---由兩個/組成
/pattern/attributes
2.RegExp構造函數:
var reg =new RegExp(“ab“,”i“); ----同1的效果
new RegExp(pattern, attributes);
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
修飾符:
對於上面的兩種定義方式,其中字符i即爲修飾符的一種,js正則修飾符共有三種
i | 忽略大小寫 |
g | 執行全局匹配(查找所有匹配而非在找到第一個匹配後停止)。 |
i:
例如測試字符串“Abc”中是否含有“ab”
不加i ---------- document.write("/ab/".test("Abc")) ; //false;
加i ----------- document.write("/ab/i".test("Abc")) ; /true/; 加上i後輸出就爲true了,即忽略了“ab”的大寫方式。
g:
例如將字符串”a b c“中的空格替換爲$符
不加g ---------- document.write("a b c".replace(/\s/,"$")); //a$b c 其中\s代表空格,結果是隻替換了第一個就停止了
加g ----------- document.write("a b c".replace(/\s/g,"$")); //a$b$c 加上g後的效果是將字符串”a b c“中的所有空格都替換了,(注意replace裏的正則並沒有加引號)。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RegExp 對象方法:
方法的參數爲String,調用者爲RegExp(因爲方法是屬於RegExp對象的,所以RegExp爲調用者)
1. exec(string):
檢索字符串中正則匹配的值。
返回一個數組,其中存放匹配的結果。如果未找到匹配,則返回值爲 null。
例如: /ab/.exec("1a2d") // null
2. test(string):
檢索字符串中是否包含正則匹配的值。
返回 true 或 false。
例如: /ab/.test("1abd") // true 測試字符創“1abd”中是否包含字符串“ab”
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
String對象的與正則相關的方法:
方法的參數爲RegExp,調用者爲String(因爲方法是屬於String對象的,所以String爲調用者)
1. search(RegExp):
檢索字符串中指定的子字符串,或檢索與正則表達式相匹配的子字符串。
返回第一個字符的位置,沒有找到則返回-1
例如:
"abcdefgbc12".search(/bc/) // 1 從字符創“abcdefg” 中檢索“bc”,找到”bc“出現的第一個位置是1(注意,search只要找到第一個就會返回,而不管有幾處都能匹配)
"abcdefgbc12".search(/bc34/) //-1 從字符創“abcdefg” 中檢索“bc12”,沒有找到“bc12”,所以返回-1
2. match(RegExp):
在字符串內檢索指定的值,或找到一個或多個正則表達式的匹配。該方法類似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。http://write.blog.csdn.net/postedit/21075889
返回匹配結果的數組。該數組的內容依賴於 regexp 是否具有全局標誌 g。
例如:
"abcdefgbc12".match(/bc/) // [bc] 返回匹配“bc”返回的數組,因爲RegExp沒有g標誌,所以返回bc
"abcdefgbc12".match(/bc/g) // [bc,bc] 返回匹配“bc”返回的數組,因爲RegExp有g標誌,所以返回所有的匹配
"abcdefgbc12".match(/bc5/) //null 沒有匹配到bc5,返回null
3. replace(RegExp):
用於在字符串中用一些字符替換另一些字符,或替換一個與正則表達式匹配的子串。
如果 regexp 具有全局標誌 g,那麼 replace() 方法將替換所有匹配的子串。否則,它只替換第一個匹配子串。
返回經過替換後的新字符串
例如:
"123@456@7".replace(/@/g,"!") // 123!456!7 將"123@456@7"中的所有“@”字符替換爲 “!”
"123@456@7".replace(/!/g,"@") // 123!456!7 將"123@456@7"中的所有“!”字符替換爲 “@”,因爲沒有找到@,所以返回原字符串
正則的量詞匹配
^n :匹配任何以n開頭的字符串。
/^b/.test("bac") //true
n+ :匹配任何包含至少一個 n 的字符串。
/b+/.test("abbc") //true
/ab*/.test("aac") //true/ab*/.test("cbbbac") //true
n? :匹配任何包含零個或一個 n 的字符串。
/ab?c/.test("ac") //true 因爲a後面的b爲0個
/ab?c/.test("abbc") //false 因爲a後面的b超過了一個所以爲false,如果將?換成*或+,則結果爲true
n$ :匹配任何結尾爲 n 的字符串。
/ab$/.test("eeeeeab") //true
/ab$/.test("eeeeeabc")//false,因爲ab並不是結尾
n{x} :匹配包含 X 個 n 的序列的字符串。
/ab{4}/.test("eeeeeabbbba") //true
/ab{4}/.test("abbbbb") //true爲什麼該字符串裏有5個b,執行結果也是true,是因爲只要包含x個b即可,即使後面還有b
n{x,} :匹配至少包含 X 個 n 的序列的字符串。
/ab{4}/.test("abbbbb") //true
n{x,y} :匹配至少包含 X 個 n 或y個n的字符串。
/ab{2,4}/.test("abbc") //true/ab{4,2}/.test("abbc") //SyntaxError: Invalid regular expression: /ab{4,2}/: numbers out of order in {} quantifier.
//這是實際測試結果,說明x必須大於或等於y,而不能小於y
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
正則的範圍匹配
範圍匹配主要是採用[ ],如下
[ abcd ] :查找方括號之間的任何字符。
/[ab]/.test("12b") //true
/[ab]/.test("12a") //true
/[ab]/.test("12a34b") //true
[^abcd ] :查找任何不在方括號之間的任何字符。
/[^ab]/.test("ab") //fasle
/[^ab]/.test("acb") //true
因爲c不既不是a,也不是b
[a-f] :中間加上- 則代表範圍,該表達式爲a到f。
/[a-f]/.test("Dghi") //fasle D不在該範圍,如果改成/[a-f]/i.test("Dghi"),即不區分大小寫,則結果爲true
/[a-f]/.test("eghi") //true 因爲e在a到f的範圍內
常用的有:
/[a-z]/ 小寫a到小寫z單一字符,/[A-Z]/ 大寫A到大寫Z單一字符,/[0-9]/ 0到9單一字符, [a-zA-Z] 大小寫單一字符
大寫字母的順序是在小寫字母前面的,所以[A-g]是正確的,[a-G]則會報錯
| :單豎線代表或者, 匹配的要麼是該符號左邊的子表達式,要麼它右邊的子表達式,即|的左邊和右邊分別是一個整體。
/ab|cd/.test("1ab23") //true
/ab|cd/.test("ac") //false
( ):小括號代表子匹配
/(ab)/.test("1ab23") //true
/(ab)ef/.test("1ab23") //false
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
正則的元字符匹配
. :代表任意字符
/./.test("%")
//true,如果需要匹配單個.怎麼辦,需要用到下方的轉義字符
/\./.test("%") //false因爲%不是.,此處的.已經被轉義,不是任意字符
/\./.test(".abc") //true
/ab\s2/.test("1ab 2") //true
\S :大S代表非空格
/ab\S2/.test("1ab 2") //false
\d :匹配數字
\d :匹配非數字
\w :匹配單詞字符(下劃線,數字或字母)
\W :匹配非單詞字符
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
常用的一些字符做一下解析
驗證手機號(國內的):
/^[1][3|5][0-9]{9}$/ 以1開頭,並且之後緊接着3或者5,然後是9個0到9的數字
驗證輸入是否只有數字,字母或下劃線組成:
/^
[0-9a-zA-Z\_]+$
/
驗證郵箱:
目前網上給的各種驗證郵箱的例子不一致,所以在此只做個思路的分析,之後發現更好地再貼上,
郵箱的格式應該是 多個字符(數字或_)
@ 多個字符(數字或_)
.多個字符結尾
所以先簡單按字面意思寫一個 /^
[0-9a-zA-Z\_]+@
/
\.[0-9a-zA-Z\_]+
$[a-zA-Z]+