1. 程式人生 > >js 正則表示式/g對exec()測試結果的影響

js 正則表示式/g對exec()測試結果的影響

遇到一個bug,程式碼的執行完全不在期望之內。
我寫了一段這樣的程式碼,實現的功能,就想實現一個簡單的jquery選擇器功能。

function $(selector){
        var ID_REG=/^\#(\w*)$/g;
        var CLASS_REG=/^\.(\w*)$/g;

        if(ID_REG.test(selector)){
            var tempt_result=ID_REG.exec(selector);
            return document.getElementById(tempt_result[0]);
        }else
if(CLASS_REG.test(selector)){ var tempt_result=CLASS_REG.exec(selector); return document.getElementByClass(tempt_result[0]); }else{ return null; } } console.log($("#images")); console.log($(".images"));

按常理,我先test一下選擇器是否和正則匹配,如果匹配,我就通過exec去提取id或者class。但是我多次測試的tempt_result這個變數始終為空。
後來發現問題存在於正則是在全域性模式下進行匹配的,並且問題就出來。
在js中每個正則表示式都是一個物件,這個物件有一個特別的例項屬性lastIndex,表示的是下一次搜尋開始的位置。在《js高階程式設計》這本書中提到,

對於exec()方法而言,在全域性模式下,它每次執行都只會返回一個匹配項,並且會改變lastIndex的值,再次執行的時候,會從lastIndex這個位置開始繼續搜尋。但是對於非全域性模式,exec每次都只會返回第一個匹配的資訊,lastIndex也不會變化。

書中只提了exec方法,卻沒有提test方法對lastIndex屬性的影響,其實test在全域性模式下,也會影響到lastIndex的值。

在上面的示例中,我首先使用了test方法來匹配,執行完之後,由於是整個串都匹配,所以ID_REG的lastIndex就是selector(『#images』)的length=7,當再執行exec的時候,由於從7開始沒有匹配的串,所以tempt_result 就是null,此時的lastIndex就是0。

找到原因之後,就很好解決了,去掉全域性模式,同時也提醒不要濫用正則的全域性模式,既然匹配的是整個串(^$就分別匹配的是字串的開頭和結尾),那麼就不需要全域性模式。

=======================更新2016-12-27==================
html5 中新增了 document.querySelector(selector),document.querySelectorAll(selector)兩個方法,其中的selector語法和jquery的選擇器語法一樣,前一個方法返回匹配的第一個元素,後一個方法返回的是匹配的全部元素,是一個類似陣列。

相關推薦

js 表示式/gexec()測試結果影響

遇到一個bug,程式碼的執行完全不在期望之內。 我寫了一段這樣的程式碼,實現的功能,就想實現一個簡單的jquery選擇器功能。 function $(selector){ var ID_REG=/^\#(\w*)$/g;

12.JS-表示式的建立和測試

什麼是正則:(模糊匹配)              1.正則表示式是一個由特殊字元(\d)和普通字元(a,b)組成的一個有規律的字串              2.正則表示式一般用於對其他字串進行邏輯過濾(驗證資訊是否合法,替換字串,分割,搜尋)             

js以及表示式實現郵箱和密碼的前端驗證

<!DOCTYPE html> <html> <head> <title>郵箱註冊</title> <style type="text/css"> td{ text-align: center; color

JS表示式全域性標記g的解釋

解答“正則表示式(/[^0-9]/g,'')中的"/g"是什麼意思?”這個問題,也為了能夠便於大家對正則表示式有一個更為綜合和深刻的認識,我將一些關鍵點和容易犯糊塗的地方再系統總結一下。 總結1:附件引數g的用法  表示式加上引數g之後,表明可以進行全域性匹配,注意這裡“可

js表示式語法

正則表示式規則 普通字元 字母、數字、漢字、下劃線、以及後邊章節中沒有特殊定義的標點符號,都是”普通字元”。表示式中的普通字元,在匹配一個字串的時候,匹配與之相同的一個字元。 舉例1:表示式 “c”,在匹配字串 “abcde” 時,匹配結果是:成功;匹配到的內容是:”c”;匹配到

表單驗證JS表示式

在表單驗證中,使用正則表示式來驗證正確與否是一個很頻繁的操作,本文收集整理了15個常用的JavaScript正則表示式,其中包括使用者名稱、密碼強度、整數、數字、電子郵件地址(Email)、手機號碼、身份證號、URL地址、 IPv4地址、 十六進位制顏色、 日期、 QQ號碼、 微訊號、車牌號、中文正則。 1

js表示式中關於零寬斷言的奇異現象

碰到一個特別的需求,就是有一段Sql Server 的 SQL片段,內容大概就是所有JOIN表的集合,要求把這個SQL片段分割成陣列,每個元素就是包含單個表的字串。 例如: SQL = INNER JOIN Sale b ON 1=1 LEFT JOIN OutStock c

js表示式驗證字串只包括大小寫字母下劃線和-

背景說明 在之前的開發過程中為了校驗一個欄位只含有大小寫字母,下劃線和-花費了不少力氣才搞定,想著趕快寫一篇部落格來記錄下來,日後開發一定會遇到!! 程式碼實現 首先定義一個變數用來存放驗證字串的正則表示式:var regex=/^[A-Za-z0-9_\-]+$/ig;

JS表示式:量詞的貪婪模式與惰性模式的區別

在說明貪婪模式與惰性模式區別之前,說明一下JS正則基礎: 1.寫法法基礎: regexObj.test(str);例如/123/.test(‘123’); 2.基本語法 錨點:匹配一個位置 ^表示起始位置;/^a/.test(‘str’);表示是否以a開頭

js表示式擷取兩個字串中間的字串

一個最常用的場景 擷取兩個字串中間的字串   var str = "iid0000ffr";     var substr2 = str.match(/id(\S*)ff/);     alert(substr2); 你會發現逗號後面是你要的

js表示式(2)

找到以某個字串開頭的字串 var myReg=/^(abc)/gim; 如果不加m,那麼只找一行,而加了m可以找到每行中以該字串開頭的匹配文字。 如: abcsfsdfasd7890hklfahskfkaluiop7890-7890782ksdlafkasdnfklsdnf;lsabc

js表示式替換(web作業)

運用正則表示式匹配“Paul;Puala,Pauline,paul,Paul”中的所以Paul,並將其替換成Ringo 程式碼如下: <!DOCTYPE html> <html> <head> <title>替換&

js表示式菜鳥例項基礎

正則表示式表單驗證例項: /是否帶有小數/ function isDecimal(strValue ) { var objRegExp= /^\d+.\d+$/; return objRegExp.test(strValue); } /*校驗是否中文名稱組成 */ function is

JS表示式之--?:

使用形如(?:pattern)的正則就可以避免儲存括號內的匹配結果。 ?:匹配冒號後的內容但是不獲取匹配結果;不進行儲存供以後使用  下面這個正則是為了實現只匹配以b或者c開頭的字串,一直匹配到換行字元,但是。可以使用“\1”來反向引用這個括號裡的子 正則表示式所匹配的內容。而且exec方法也會

js表示式之match函式

功能:使用正則表示式模式對字串執行查詢,並將包含查詢的結果作為陣列返回  函式格式:stringObj.match(rgExp) stringObj為字串必選 rgExp為正則表示式必選項  返回值:如果能匹配則返回結果陣列,如果不能匹配返回null  使用方法:&nb

Js 表示式驗證

手機號碼驗證 130,131,132,133,134,135,136,137,138,139,147,150,151,152,153,155,156,157,158,159,177,173180,181,182,185,186,187,188,189 function ch

常用js表示式大全

常用js正則表示式大全  一、校驗數字的js正則表示式  1 數字:^[0-9]*$ 2 n位的數字:^\d{n}$ 3 至少n位的數字:^\d{n,}$ 4 m-n位的數字:^\d{m,n}$ 5 零和非零開頭的數字:^(0|[1-9][0-9

js表示式驗證價格

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus®"> <me

值得收藏的八個常用的js表示式

 開發中如果有input輸入框,難免就要寫正則表示式,因此在這裡總結了一些常見常用的正則表示式的書寫方法,希望會大家有所幫助; 附圖:   一.手機號碼 $(document).ready(function(){ //判斷輸入手機號碼是否正確

js 表示式 整合

url的正則表示式:包括IP,域名(domain),ftp,二級域名,域名中的檔案,域名加上埠!使用者名稱等等資訊 function IsURL(str_url) { var strRegex = "^((https|http|ftp|rtsp|mms)?://)" +