1. 程式人生 > >JS中正則匹配的3個方法:match,exec,test

JS中正則匹配的3個方法:match,exec,test

1. regExp.test(string)

  該方法最簡單,在string中找到匹配regExp的字串則返回true,沒找到匹配的字串則返回false

2. regExp.exec(string)

  該方法稍微複雜些。

  當regExp沒有全域性標誌時,其返回值為字串陣列:陣列的第0號元素為剛匹配到的字串,如果regExp有子表示式,則陣列第1號元素為regExp的第一個子表示式,第2號元素為regExp的第二個字表達式...以此類推。在上例中如果
patt = new RegExp('f(\\d)(\\d)','g');則 ret_exec 將為字串陣列:['f12','1','2']。

  在設定g屬性後,雖然匹配結果不受g的影響,返回結果仍然是一個數組(第一個值是第一個匹配到的字串,以後的為分組匹配內容),但是會改變index和lastIndex等的值,將該物件的匹配的開始位置設定到緊接這匹配子串的字元位置,當第二次呼叫exec時,將從lastIndex所指示的字元位置開始檢索。同樣match方法在設定了g屬性後,也會改變index和lastIndex的值,但是是一次性的。無法像exec那樣能逐過程累積,因此無法累積獲取下一次檢索的位置。

<script>
  var patt = new RegExp('ab', 'g');
  var str = 'abcdef12ab34cd56ef';
  var ret;
  while((ret = patt.exec(str))!=null) { 
    document.write(ret+"</br>");
    document.write("ret.input="+ret.input+"</br>");
    document.write("ret.index="+ret.index+"</br>");
    document.write("RegExp.lastIndex ="+RegExp.lastIndex +"</br>");

  }
</script>

執行:
ab
ret.input=abcdef12ab34cd56ef
ret.index=0
RegExp.lastIndex =2
ab
ret.input=abcdef12ab34cd56ef
ret.index=8
RegExp.lastIndex =10


exec方法返回的不是標準的陣列,應該算是一個類陣列,因為它還有2個屬性:input是輸入的字串,index是當前匹配的字串第一個字元在input中的位置。

3. string.match(regExp)

  該方法比exec簡單一些,因為它不用考慮regExp的lastIndex屬性。同樣,也需要分兩種情況(全域性匹配與非全域性匹配)

  當regExp沒有全域性標誌時,返回值與呼叫exec一樣,返回一個數組,陣列的第0號元素為剛匹配到的字串,如果regExp有子表示式,則陣列第1號元素為regExp的第一個子表示式,第2號元素為regExp的第二個字表達式...以此類推。主意該陣列同時還有2個屬性:input是輸入的字串string,index是當前匹配的字串第一個字元在input中的位置。

  當regExp有全域性標誌(g選項)時,很簡單,也符合我們的理解:返回所有匹配到的字串組成的陣列。這是標準陣列,沒有input屬性,也沒有index屬性。返回值陣列中除了匹配到的字串沒有任何其他資訊。

<script>
  var src = "The rain in Spain falls mainly in the plain.";
  var re = /\w+/g; //有g屬性。 
  var i = 0;
  while (i++<10){
   arr = src.match(re);
   document.write(RegExp.index + "-" + RegExp.lastIndex + "\t" + arr + "<br/>");

  }
</script>

執行:
38-43 The,rain,in,Spain,falls,mainly,in,the,plain
38-43 The,rain,in,Spain,falls,mainly,in,the,plain
38-43 The,rain,in,Spain,falls,mainly,in,the,plain
38-43 The,rain,in,Spain,falls,mainly,in,the,plain
38-43 The,rain,in,Spain,falls,mainly,in,the,plain
38-43 The,rain,in,Spain,falls,mainly,in,the,plain
38-43 The,rain,in,Spain,falls,mainly,in,the,plain
38-43 The,rain,in,Spain,falls,mainly,in,the,plain
38-43 The,rain,in,Spain,falls,mainly,in,the,plain
38-43 The,rain,in,Spain,falls,mainly,in,the,plain

  從上面的分析看出,如果你只是想判斷字串是否匹配某個正則表示式,就用test方法。如果想一次性取出所有匹配到的字串,或者只找到第一個匹配的字串就可以,就用match方法。如果你想多次匹配,而且需要知道每個匹配到的字串在原始字串中的位置,或者正則表示式中還有子表示式資訊需要關注,就用exec方法。

測試題:
var someText="web2.0 .net2.0";
var pattern=/(\w+)(\d)\.(\d)/g;
var outCome_exec=pattern.exec(someText);
var outCome_matc=someText.match(pattern);

What is outCome_exec[1] and outCome_matc[1]??

Choice A: true
Choice B: false
Choice C: null
Choice D: Web
Choice E: Web2.0
Choice F: undefined
Choice G: net2.0

答案為D和G。你想明白了麼?

相關推薦

JS匹配3方法match,exec,test

1. regExp.test(string)   該方法最簡單,在string中找到匹配regExp的字串則返回true,沒找到匹配的字串則返回false 2. regExp.exec(string)   該方法稍微複雜些。   當regExp沒有全域性標誌時,其返回值為字串陣列:陣列的第0號元素為

PHP4反斜槓的問題 匹配 3反斜槓的情況

背景: 今天在學習正則表示式,遇到了一個問題,php中4個反斜槓\在不同直譯器中的結果。 正文: 我們先來看看以下程式碼 echo '\'; 執行之後報語法錯誤,提示unexpected'\'; ',即\'; 這幾個字元出了問題 Parse error: sy

js表示式test()方法

正則表示式即描述字串規則的表示式 /pattern/attrs          /規則/屬性 new RegExp(pattern,attrs) regexObj.test(str)方法:測試正則表示式與指定字串是否匹

python匹配字符配置單詞邊界不生效的解決辦法

re python duoceshi #-*-coding:utf-8-*-import rename="duoceshi"p= re.compile(‘\bduoceshi\b‘)f = p.search(name)if f: print f.group()################

匹配之replace方法

lac 一次 var 字符 div 之前 認知 color return 在我印象中,replace方法就是一個正則匹配,然後一股腦的替換掉匹配到的內容的一個方法。 在一次任務需求中,有這麽一個需求,一行字符串裏面,替換相應字符串,具體就是匹配到‘A’然後把‘A’替換成‘a

Python匹配使用findall,捕獲分組(xxx)和非捕獲分組(?:xxx)的差異

bbb tps img 是把 區別 內容 是我 解答 什麽是 轉自:https://blog.csdn.net/qq_42739440/article/details/81117919 下面是我在用findall匹配字符串時遇到的一個坑,分享出來供大家跳坑。 例題: 如圖

Flask匹配路由及路由轉換器

正則匹配路由 ​ 在 web 開發中,可能會出現限制使用者訪問規則的場景,那麼這個時候就需要用到正則匹配,根據自己的規則去限定請求引數再進行訪問 具體實現步驟為: 匯入轉換器基類(BaseConverter):在 Flask 中,所有的路由的匹配規則都是使用轉換器物件進行

JS表示式詳解及最基本的判斷手機號,郵箱,身份證

    首先最基本的符號型別及含義整理一下。     1,最基本的符號:^  $  *  +  ?         ^    代表字串的開始位置 &nbs

關於js表示式使用的一些簡單實現,比如驗證QQ號碼,郵箱,ip等等...

// 1. 簡單的匹配qq號碼(9位數字) var str = "123456788"; var regex1 = /^(\d{9})$/g; str.match(regex1); // 或者 var str = "niahfdb1345342123"

js表示式元字元不起作用的問題……

今天在專案過程中發現一個問題,在網上拷的一段驗證日期的正則表示式在專案中不起作用,在很多線上測試正則表示式的網站上都做過測試,自己也讀了正則程式碼,就是看出來有什麼問題: function checkInDate(inStrdate) { var regex = n

js表示式判斷是否是數字

function isNumber(val){    var regPos = /^\d+(\.\d+)?$/; //非負浮點數    var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9

JS表示式的基礎知識點元字元

正則表示式:又稱為:規則表示式 英語;Regluar Expression 簡寫:regex,regexp或者RE 正則表示式:不是字串,是字串的匹配模式(規則) 需要用反斜槓進行轉移 正則表示式的建立: 1.字面量建立:由兩個斜槓/包裹 var reg = /a/

JS表達式

d+ 換行 font 替換 import p s 比較 模式匹配 str2 正則表達式用於對字符串模式匹配及檢索替換,是對字符串執行模式匹配的強大工具。簡單來說正則表達式就是處理字符串的,我們可以用它來處理一些復雜的字符串。 創建方式 var reg = new RegE

js事件繫結3方法以及事件委託

事件繫結 首先,我先來介紹我們平時繫結事件的三種方法。 1.嵌入dom <button onclick="open()">按鈕</button> <script> function open(){ alert(

js表示式的貪婪模式和非貪婪模式

在講貪婪模式和惰性模式之前,先回顧一下JS正則基礎: 寫法基礎: ①不需要雙引號,直接用//包含 => /wehfwue123123/.test(); ②反斜槓\表示轉義 =>/\.jpg$/ ③用法基礎:.test(str); 語法: ①錨點類 /^a/=&g

Python匹配使用findall時的註意事項

使用 earch 寫法 為什麽 tps 功能 str span port 在使用正則搜索內容時遇到一個小坑,百度搜了一下,遇到這個坑的還不少,特此記錄一下。 比如說有一個字符串 "[email protected]@[email protected]@asdfc

【2017-11+10】 JS表示式詳解

在JS的開發過程中,很多時候都需要驗證表單的正確性;使用正則表示式能夠很好的簡化表單的驗證過程。 在JS中,內建了 RegExp 物件,用來進行正則匹配。 一. RegExp 物件的使用

Python3模組re.compile、re.match及re.search

本文例項講述了Python3中正則模組re.compile、re.match及re.search函式用法。分享給大家供大家參考,具體如下: re模組 re.compile、re.match、 re.search re 模組官方說明文件 正則匹配的時候,第一個字元是 r,表示 raw string 原生字

Python3模組re.compile、re.match及re.search函式用法詳解

本文例項講述了Python3中正則模組re.compile、re.match及re.search函式用法。分享給大家供大家參考,具體如下: re模組 re.compile、re.match、 re.search re 模組官方說明文件 正則匹配的時候,第一個字元是 r,表示 raw string 原生字

【RegExp】JavaScript表達式判斷匹配規則以及常用方法

返回 空字符串 tro true 正則表達式 str 本地 大小 表示範圍 字符串是編程時涉及到的最多的一種數據結構,對字符串進行操作的需求幾乎無處不在。 正則表達式是一種用來匹配字符串的強有力的武器。它的設計思想是用一種描述性的語言來給字符串定義一個規則,凡是符合規則的字