本篇博客介紹一些正則表達式相關的語法以及一些字符串的方法。
什麼是正則表達式?
正則表達式(Regular Expression,在代碼中常簡寫爲regex,regexp或RE),又稱爲規則表達式。主要用來定義一些字符串的規則,使得計算機可以根據正則表達式來檢查一個字符串是否符合規則。
正則表達式的創建
正則表達式有兩種創建方式:
- 使用構造方法創建;語法:
var reg = new RegExp("正則表達式", "匹配模式");
; - 使用字面值常量創建;語法:
var reg = /正則表達式/匹配模式;
;
兩種方法都可以用來創建一個正則表達式,使用字面量創建更加簡單,使用構造函數創建更加靈活(構造函數中傳入的是字符串,可以傳入一個變量)。
常用的匹配模式:
- i:忽略大小寫;
- g:全局匹配。
正則表達式的簡單使用
正則表達式對象中有一個test()
方法,使用這個方法可以檢查一個字符串是否符合正則表達式的規則,符合規則返回true,否則返回false。
// 創建一個正則表達式
// 該正則表達式可以用來檢查一個字符串中是否含有a或A,忽略大小寫
var reg = /a/i;
// 驗證下面三個字符串是否符合正則表達式的規則
document.write("reg.test(\"abcdeg\"): " + reg.test("abcdeg") + "<br />");
document.write("reg.test(\"bcAdeg\"): " + reg.test("bcAdeg") + "<br />");
document.write("reg.test(\"bcdeg\"): " + reg.test("bcdeg") + "<br />");
正則表達式的基本語法
我們通過一些簡單的需求來介紹基本語法:
[]
:[]中的內容表示或的關係,和|一樣;如:[ab]
表示a或b,a|b
也表示a或b。
檢查一個字符串中是否含有a或b:
// 檢查字符串中是否包含a或b
var reg1 = /[ab]/;
var reg2 = /a|b/;
document.write("reg1: " + reg1 + "<br />");
document.write("reg1.test(\"acdeg\"): " + reg1.test("acdeg") + "<br />");
document.write("reg1.test(\"bcdeg\"): " + reg1.test("bcdeg") + "<br />");
document.write("reg1.test(\"cdeg\"): " + reg1.test("cdeg") + "<br /><br />");
document.write("reg2: " + reg2 + "<br />");
document.write("reg2.test(\"acdeg\"): " + reg2.test("acdeg") + "<br />");
document.write("reg2test(\"bcdeg\"): " + reg2.test("bcdeg") + "<br />");
document.write("reg2test(\"cdeg\"): " + reg2.test("cdeg") + "<br />");
[a-z]
表示a或b或c…或z,表示任意小寫字母;同樣的[A-Z]
表示任意大寫字母;[0-9]
表示任意數字。
檢查一個字符串中是否包含任意小寫字母:
// 檢查是否包含任意小寫字母
var reg = /[a-z]/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"ae86\"): " + reg.test("ae86") + "<br />");
document.write("reg.test(\"9527\"): " + reg.test("9527") + "<br />");
檢查一個字符串中是否包含xyz或xaz或xuz:
// 檢查是否包含xaz或xuz或xyz
var reg = /x[auy]z/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"xaz\"): " + reg.test("xaz") + "<br />");
document.write("reg.test(\"xuz\"): " + reg.test("xuz") + "<br />");
document.write("reg.test(\"xyz\"): " + reg.test("xyz") + "<br />");
document.write("reg.test(\"xyy\"): " + reg.test("xyy") + "<br />");
[^]
:表示除了,如:[^ab]
表示除了a和b。
檢查字符串中是否包含除了xyz之外的字符:
// 檢查是否包含除了xyz的其他字符
var reg = /[^xyz]/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"xyz\"): " + reg.test("xyz") + "<br />");
document.write("reg.test(\"x\"): " + reg.test("x") + "<br />");
document.write("reg.test(\"y\"): " + reg.test("y") + "<br />");
document.write("reg.test(\"z\"): " + reg.test("z") + "<br />");
document.write("reg.test(\"axyz\"): " + reg.test("axyz") + "<br />");
量詞:
{n}
:正好出現n次,如:a{3}
等價於aaa
;{m,n}
:出現m~n
次,如:a{1~3}
等價於a|aa|aaa
;{m,}
:出現m次及以上;+
:出現至少一次,等價於{1,}
;*
:出現0次或多次,等價於{0,}
;?
:出現0次或一次,等價於{0,1}
。
注意:量詞只對它前邊的一個內容起作用。
檢查一個字符串中是否包含xyzxyzxyzxyz:
// 檢查是否包含xyzxyzxyzxyz
var reg = /(xyz){4}/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"xyzxyzxyzxyz\"): " + reg.test("xyzxyzxyzxyz") + "<br />");
document.write("reg.test(\"xyzxyz\"): " + reg.test("xyzxyz") + "<br />");
^
:表示以什麼開頭,如^a
:表示以a開頭;
$
:表示以什麼結尾,如a$
:表示以a結尾;
檢查一個字符串是否以abc開頭或以xyz結尾:
// 檢查一個字符串是否以abc開頭或以xyz結尾
var reg = /^abc|xyz$/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"abcxyz\"): " + reg.test("abcxyz") + "<br />");
document.write("reg.test(\"abchehe\"): " + reg.test("abchehe") + "<br />");
document.write("reg.test(\"hehexyz\"): " + reg.test("hehexyz") + "<br />");
document.write("reg.test(\"hehe\"): " + reg.test("hehe") + "<br />");
下面看一個例子:
// 檢查一個字符串是否爲s
// 以s開頭,立刻結束,只能是s
var reg = /^s$/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"s\"): " + reg.test("s") + "<br />");
document.write("reg.test(\"bs\"): " + reg.test("bs") + "<br />");
document.write("reg.test(\"sb\"): " + reg.test("sb") + "<br />");
小練習,創建一個正則表達式,用來檢查一個字符串是不是一個合法的手機號:
首先,我們來分析,手機號第一位只能是1,第二位只能是3~9的數字,剩餘的9位可以是任何數字。
// 檢測一個字符串是不是一個合法的手機號
var reg = /^1[3-9][0-9]{9}$/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"15599631399\"): " + reg.test("15599631399") + "<br />");
document.write("reg.test(\"12599631399\"): " + reg.test("12599631399") + "<br />");
document.write("reg.test(\"32599631399\"): " + reg.test("32599631399") + "<br />");
元字符:
\w
:任意字母、數字和下劃線;\W
:與\w相反,除了字母、數字和下劃線;\d
:任意數字,等價於[0-9];\D
:和\d相反,除了數字;\s
:空格;\S
:和\s相反,除了空格;\b
:單詞邊界;\B
:和\b相反,除了單詞邊界;.
:表示任意字符,如果想要在表達式中使用.
需要使用\
進行轉義,即:\.
。
小練習:創建一個正則表達式,檢測一個字符串是否是一個合法的郵箱格式。
郵箱格式如:[email protected]
。我們規定@前的xxx
可以使用數字、字母和下劃線,長度必須在2~10之間,@後的xxx
只能是字母或數字。
// 檢測一個字符串是否符合郵箱格式
var reg = /^\w{2,10}@[A-Za-z0-9]{2,10}\.com$/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"[email protected]\"): " + reg.test("[email protected]") + "<br />");
document.write("reg.test(\"[email protected]\"): " + reg.test("[email protected]") + "<br />");
document.write("reg.test(\"##[email protected]\"): " + reg.test("##[email protected]") + "<br />");
正則表達式在字符串相關方法中的使用
split()
將一個字符串拆分爲數組,可以傳入一個正則表達式,就可以根據正則表達式匹配到的字符串進行切分。
var str = "1A2B3C4D5E6F7G";
var reg = /[A-Z]/;
// 根據任意字母切分字符串
var result = str.split(reg);
alert("result: " + result);
search()
檢索與正則表達式相匹配的內容,如果搜索到指定內容,返回第一次出現的索引;如果沒有搜到,返回-1。可以接收一個正則表達式作爲參數,然後會根據正則表達式去檢索字符串。
var str = "abcxyzxyzxyzabc";
var reg = /(xyz){3}/;
// 查找匹配的字符串
var result = str.search(reg);
alert("result: " + result);
match()
可以根據正則表達式,從一個字符串中將符合條件的內容提取出來,默認情況下match只會找到第一個符合要求的內容,找到以後就停止檢索,我們可以設置正則表達式爲全局匹配模式,這樣就會匹配到所有的內容。可以爲一個正則表達式設置多個匹配模式,且順序無所謂,match會將匹配到的內容封裝到一個數組中返回。
var str = "abcxyAbczxaBcbcxyzaECheheabch";
var reg = /a[be]c/ig;
// 將匹配的內容提取出來
var result = str.match(reg);
alert("result: " + result);
replace()
可以將字符串中指定的內容替換爲新的內容,默認只會替換匹配到的第一個,可以將正則表達式設置爲全局匹配模式,替換全部。
var str = " admin ";
var regex = /^\s*|\s*$/g;
// 將字符串的左右空格全部替換爲空串
var result = str.replace(regex, "");
alert("result: [" + result + "]");