JavaScript中正則表達函數的說明與應用

來源:互聯網
上載者:User

作為模式比對下文本替換、搜尋、提取的強有力工具,Regex(Regular Expression)的應用已經從unix平台逐漸滲入到網路開發中了,作為伺服器端/用戶端的指令碼開發語言JScript,正越來越多將Regex應用融入其中,以彌補自身在文本上處理能力的不足。在此,我們以JScript5.5版本為例,對其中的Regex的應用作一個概述。
首先我們需要區分JScript中關於Regex的兩個對象:Regular Expression對象和RegExp對象。
前者僅包含一個特定的Regex執行個體的資訊,而後者通過一個全域變數的屬性來反映最近模式比對的特性。
前者在匹配前需要指定匹配模式,即建立一個Regular Expression對象的執行個體,而後可以把它傳遞給一個字串方法,或是把一個字串作為參數傳遞給這個Regular Expression執行個體的方法;而後者無需建立,它是一個固有的全域對象,每次成功匹配操作結果資訊被儲存在這個對象的屬性中。

一、RegExp對象的屬性:反應最近一次成功匹配的結果資訊

input  :儲存執行匹配的字串(被搜尋的目標字串)(>=IE4)
index  :儲存匹配的首字元的位置*>=IE4)
lastIndex :儲存匹配的字串的下一個字元的位置(>=IE4)
lastMatch($&) :儲存匹配到的字串(>=IE5.5)
lastParen($+) :儲存匹配結果最後一個子匹配的內容(最後一個括弧的匹配內容)(>=IE5.5)
leftContext($`) :儲存目標字串中匹配子字串前的所有字元 (>=IE5.5)
rightContext($'):儲存目標字串中匹配子字串後的所有字元 (>=IE5.5)
$1 - $9  :儲存匹配中最開始的9個子匹配(即最開始的9個括弧內的匹配結果)(>=IE4)

二、Regular Expression對象簡介
1.Regular Expression對象定義
在指令碼中使用Regex模式比對,首先腰設定匹配模式,方法有如下兩種
(1)rgExp=/pattern*/[flags*]
(2)rgExp=new RegExp("pattern",["flags"])
注意:
a.後者模式中的逸出字元“\”需要用“\\”表示,用以抵消JS中逸出字元"\"的意義,否則JS首先作為自己的轉義概念來解釋"\"後的字元。
b.flags標識有以下幾個(至JScript 5.5版本)
  g:設定當前匹配為全域模式
  i:忽略匹配中的大小寫檢測
  m:多行搜尋模式
2.Regular Expression對象屬性
(1)rgExp.lastIndex:匹配結果後面一個字元的位置,同RegExp.lastIndex
(2)rgExp.source:reExp對象的Regex匹配模式
3.Regular Expression對象方法
(1)rgExp.compile(pattern,[flags])
將rgExp轉化為內部格式,以加快匹配的執行,這對於大量模式一致的匹配更有效
(2)rgExp.exec(str)
按照rgExp的匹配模式對str字串進行匹配尋找,當rgExp對象中設定了全域搜尋模式(g),則匹配尋找從RegExp對象lastIndex屬性所指定的目標字串位置開始;若沒有設定全域搜尋,則從目標字串第一個字元開始搜尋。若沒有任何匹配發生,返回null。
需要注意的是該方法將匹配結果放在一個數組內返回,該數組有三個屬性
input:包含目標字串,同RegExp.index
index:匹配到的子字串在目標字串中的位置,同RegExp.index
lastIndex:匹配到的子字串後面一個字元的位置,同RegExp.lastIndex
(3)rgExp.test(str)
返回布爾值來反映被尋找的目標字串str中是否存在符合匹配的模式。該方法不改變RegExp的屬性
4.與Regex相關的方法
主要是指字串對象中應用模式比對的方法
(1)stringObj.match(rgExp)
根據rgExp對象的Regex模式尋找字串stringObj中的匹配字元項,將結果以數組形式返回。該數組有三個屬性值,與exec方法返回的數組屬性相同。若沒有任何匹配,返回null。
需要注意的是,若rgExp對象未設定全域匹配模式,則數組0下標元素為匹配的整體內容,1~9包含了子匹配得到的字元。若設定了全域模式,則數組包含了搜尋到的所有整體匹配項。
(2)stringObj.replace(rgExp, replaceText)
返回一個字串,即將stringObj中符合rgExp模式比對的字串替換成replaceText後返回。需要注意的是stringObj本身並不因為替換操作而改變。若期望stringObj中所有符合Regex模式的字串被替換,則在建立Regex模式時要設定為全域模式。
(3)stringObj.search(rgExp)
返回第一個匹配到的子字串的位置

符號名詞解釋:
位置:表示子字串與目標字串首字元的位移
reExp:表示一個Regular Expression對象執行個體
stringObj:表示一個字串對象
pattern:Regex模式
flags:匹配操作的模式標識

在實際web程式開發中我們可以有針對性的使用Regex來達到我們字串處理的要求
如下附上四個使用Regex的JScript常式,這些例子主要用來熟悉Regex的使用。

1.email地址有效性檢測
<script language='JScript'>
function validateEmail(emailStr)
{
 var re=/^[\w.-]+@([0-9a-z][\w-]+\.)+[a-z]{2,3}$/i;
 //或 var re=new RegExp("^[\\w.-]+@([0-9a-z][\\w-]+\\.)+[a-z]{2,3}$","i");
 if(re.test(emailStr))
 {
  alert("有效email地址!");
  return true;
 }
 else
 {
  alert("無效email地址!");
  return false;
 }
}
</script>

2.字串替換操作
<script language='JScript'>
var r, pattern, re;
var s = "The rain in Spain falls mainly in the plain falls.";
pattern = /falls/ig;
re = s.replace(pattern,'falling');
alert('s = ' + s + '\n' + 're = ' + re);
</script>

3.模式尋找字串
<script language='JScript'>
var index, pattern;
var str = "four for fall fell fallen fallsing fall falls waterfalls ";
pattern = /\bfalls\b/i;
index = str.search(pattern);
alert('The position of match is at ' + index);
</script>

3.Regex屬性常式
<script language='JScript'>
function matchAttrib()
{
   var s='';
   var re = new RegExp("d(b+)(d)","ig");
   var str = "cdbBbdbsbdbdz";
   while((arr = re.exec(str))!=null)
   {
    s += "=======================================<br>";
    s += "$1 returns: " + RegExp.$1 + "<br>";
    s += "$2 returns: " + RegExp.$2 + "<br>";
    s += "$3 returns: " + RegExp.$3 + "<br>";
    s += "input returns : " + RegExp.input + "<br>";
    s += "index returns : " + RegExp.index + "<br>";
    s += "lastIndex returns : " + RegExp.lastIndex + "<br>";
    s += "lastMatch returns: " + RegExp.lastMatch + "<br>";
    s += "leftContext returns: " + RegExp.leftContext + "<br>";
    s += "rightContext returns: " + RegExp.rightContext + "<br>";
    s += "lastParen returns: " + RegExp.lastParen + "<br>";
    s += "arr.index returns: " + arr.index + "<br>";
    s += "arr.lastIndex returns: " + arr.lastIndex + "<br>";
    s += "arr.input returns: " + arr.input + "<br>";
    s += "re.lastIndex returns: " + re.lastIndex + "<br>";
    s += "re.source returns: " + re.source + "<br>";
   }
   return(s);                            //Return results.
}
document.write(matchAttrib());
</script>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.