1. 程式人生 > >學習Vue中那些正則表示式

學習Vue中那些正則表示式

想看懂Vue的template解析部分,會發現其中有大量的正則表示式。所以先學習基礎知識。

其實正則表示式並不難,關鍵在於拆分理解,並且經常使用。就可以很好的熟悉正則表示式了。具體語法可參照正則表示式 - JavaScript | MDN

正則用法

在JavaScript中正則表示式用法為:

/正則表示式特殊字元/修飾符(可選)

特殊字元

這裡列一下正則的特殊字元及其用法,加深理解和映象。
* \ 將字元變為特殊或非特殊字元。如 n 變為換行符 \n,特殊符號 ( 變為字元 \(
* ^ 匹配字串起始位置。
* $ 匹配字串結束位置。
* * 匹配前面的子表示式零到多次。
* +

匹配前面的子表示式一到多次。
* ? 匹配前面的子表示式零到一次。
* {n} 匹配前面的子表示式的n個,如 o{2} 能夠匹配 food 不能匹配 god
* {n,} 至少匹配n個前面的子表示式,如 o{2,} 能夠匹配 fooooood 不能匹配 god
* {n, m} 至少匹配n次,至多匹配m次。
* 非貪婪模式 預設為貪婪模式,如 o+ 將匹配 foooood 的所有 o。而非貪婪模式(在匹配符後面加 ?),如 o+? 則只會匹配一個o
* . 匹配除換行符外任何單個字元。換行符為 \n\r
* (x) 捕獲括號,匹配並記住匹配項。
* (?:x) 非捕獲括號,匹配並不記住匹配項。如 /(?:foo){1,2}/
,這裡將 foo 作為一個整體進行匹配1到2次。
* x(?=y) 匹配x僅僅在x後面跟y的時候。?=y 表示字串末尾是y。
* x(?!y) 匹配x僅僅在x後面不跟著y的時候。?!y 表示字串末尾不是y。
* x|y 匹配 x 或 y,如 jack|rose 就可以匹配到 jack 和 rose 兩個字串。
* [xyz] 匹配方括號內任意字元。
* [^xyz] 反向字符集,匹配除方括號內字元的任意字元。
* [0-9] 範圍匹配,匹配0-9範圍內任意字元。
* \w 查詢單詞字元。單詞字元包括:a-z、A-Z、0-9,以及下劃線。
* \W 查詢非單詞字元。
* \d 查詢數字字元。
* \D
查詢非數字字元。
* \s 查詢空白字元。空白字元包括空格、\n、\f、\r、\t、\v。
* \S 查詢非空白字元。
* \b 匹配單詞邊界,通常匹配單詞開頭和結尾。如 /\bcd/ 匹配 cdkey
* \B 匹配非單詞邊界。如 /\Bcd/ 匹配 abcd
* \O 查詢 NULL 字元。
* \n 換行符。
* \f 換頁符。
* \r 回車符。
* \t 製表符。
* \v 垂直製表符。

修飾符

  • i 執行對大小寫不敏感的匹配。
  • g 執行全域性匹配。
  • m 執行多行匹配。

簡單正則例項分析

上面介紹了正則的簡單用法,下面收集一些簡單的正則進行分析。

/^[0-9]*$/

0-9範圍內0到多個數字的組合,且字元開頭結尾都是0-9的數字。即表示整數。如 1314、0

/^\d{m,n}$/

匹配m-n位的數字。由於開頭結尾都是數字,所以它是一個固定長度的純數字。

/^\-[1-9][0-9]*$/

匹配-開頭,數字結尾,第一個字元為1-9,隨後0-n個字元為0-9的字元。即非零負整數。

/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/

這是匹配郵件的一個正則,我們一點點看。
開頭匹配1-n個單詞字元;
括號裡匹配 [-+.] 字元加上1-n個單詞字元,括號內容匹配0-n次;
加上@字元;
加上1-n個單詞字元字元
括號裡匹配 [-.] 字元加上1-n個單詞字元,括號內容匹配0-n次;
加上.字元
加上1-n個單詞字元字元
括號裡匹配 [-.] 字元加上1-n個單詞字元,括號內容匹配0-n次;
結尾;
這裡考慮了很多因素郵箱命名因素,一般的郵箱地址像 [email protected] 這種肯定是沒問題的。所以,我極端測試來展現它列出的可能性,結果如下(我把所有可能性都符合了一遍):
正則測試結果

/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/

再來看個手機號驗證。一步步來:
開頭匹配手機號前三位是 13[0-9] 或 14[5|7] 或者 15[0|1|2|3|5|6|7|8|9] 或 18[0|1|2|3|5|6|7|8|9];
匹配後八位數字為0-9的字元;
結束。

/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/

這是驗證身份證的正則,來看看:
開頭為一個1-9的數字;
加上五位0-9的數字;
加上一位1-9的數字;
加上三位0-9的數字;
加上 0/d 或者 1[0-2],即月份 01、02……12;
加上 ([0|1|2]\d) 或者 3[0-1],即日起,01、13、25、31;
加上身份證末四位;

/^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$/

這是xml檔案命名正則。
開頭為 1-n個 [a-zA-Z] 字元 加上 0-1個 - 組成;
括號內的內容可重複1-n次;
加上1-n個 [a-zA-Z0-9] 字元;
加上 ·.·;
加上 x 或 X;
加上 m 或 M;
加上 l 或 L;
結尾;

解析 Vue 原始碼中的正則

/;(?![^(]*\))/g

由於 ?! 符號,所以是匹配 ; 字元。
我們之前說過,?! 符號表示字串末尾不是指定字串。
這個指定字串 [^(]*\) 解析為 0-n 個不為 ( 的任意字元加上 )
用例子說明。匹配條件為 ; 字元後面不能跟 ;xx)xx 但是可以跟 ;(xx)xx

/:(.+)/

以上正則表示匹配 : 加上 1-n 個 .

var defaultTagRE = /\{\{((?:.|\n)+?)\}\}/g;
var regexEscapeRE = /[-.*+?^${}()|[\]\/\\]/g;

defaultTagRE 的正則:匹配 {{ 字元,然後匹配非換行符或 \n (即排除了 \r),最後加上 }}
regexEscapeRE 的正則:全域性匹配 -.*+?^${}()|[]/\。注意,只有在 ()| 才表示或,如 /(g|f)ood/

/&(?:lt|gt|quot|amp|#10|#9);/g

匹配 <>"&amp
	

var onRE = /^@|^v-on:/;  // 以@或v-on開頭的字元
var dirRE = /^v-|^@|^:/; // 以v-、@、:開頭的字元
var forAliasRE = /(.*?)\s+(?:in|of)\s+(.*)/; // 匹配如 item in list 或者 item of list
var forIteratorRE = /\((\{[^}]*\}|[^,]*),([^,]*)(?:,([^,]*))?\)/;

var argRE = /:(.*)$/; // 匹配 : 加上 0-n 個非換行字元結尾的條件
var bindRE = /^:|^v-bind:/; // 匹配 : 或 :v-bind 開頭的字元
var modifierRE = /\.[^.]+/g; // 全域性匹配 `.` 加上 1-n 個非 `.` 字元。

解析一下這個 forIteratorRE,其實就是看著亂。
先得到一個 ( 字元;
再獲取 (\{[^}]*\}|[^,]*) ,這裡匹配的是 { 加 0-n 個非 } 字元加 },或者 0-n 個非 , 字元。
加上字元 ,;
得到 ([^,]*) , 這裡匹配的是 0-n 個非 , 字元;
得到 (?:,([^,]*))?\),加上字元 , 然後加上 0-n 個非 , 字元,這整個表示式,數量為 0-1;
最後加上 )
所以匹配字串可以是 (,)({abc},wc,uvw)

/'(?:[^'\\]|\\.)*'
|"(?:[^"\\]|\\.)*"
|`(?:[^`\\]|\\.)*\$\{
|\}(?:[^`\\]|\\.)*`
|`(?:[^`\\]|\\.)*`/g

以上正則看似很長,其實通過 | 或關係進行拆分,敲回車便於檢視後發現,其實是由五個表示式組合起來的。
邏輯差不多,看第一個表示式:先新增' ,然後新增0-n個非 '\ 的字元,最後加上 '。如 'abc'

/-(\w)/g

先新增 - 字元,再新增單詞字元,進行匹配。

/\B([A-Z])/g

不在單詞邊界上的 A-Z 的字母字元,如 rAr

/(?:^|[-_])(\w)/g

字串第一個字元為單詞字元,或者以 [-_] 加字元形式出現的匹配。

/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/

再長的正則拿到手就需要進行拆分:
^\s* 表示以0-n個空白字元開頭;
([^\s"'<>\/=]+) 表示有1-n個非 空白字元、"'<>\/=的字元。
最後一個表示式較長,而且由於表示式最後有 ?,所以這段表示式可以不匹配。先是0-n個空白字元,加上 = 號,加上 0-n 個空白字元。之後有三種情況:情況一:加上 ,加上 0-n 個非空白字元,再加上1-n個 ;情況二:加上 ',加上 0-n 個非空白字元,再加上1-n個 ';情況三:加上1-n個非 空白字元、"'=<>、` 的字元。

最後

正則表示式看到這也算是有了一定了解了。
其實只要懂得正則基本語法、然後耐心去看去理解,會發現正則也不是那麼難的。
這裡推薦 https://regex101.com/#javascript 這個工具,本部落格就是一邊用這個工具實踐驗證一邊寫的,非常好用!
我先通過猜測理解正則大致意思,然後用這個工具去驗證,驗證成功,反推回來更好理解正則表示式。
就是這樣!

明日預告

既然正則被我們搞定了,那麼明天寫 Vue 的 template 解析問題就不大啦。敬請期待~

相關推薦

學習Vue那些表示式

想看懂Vue的template解析部分,會發現其中有大量的正則表示式。所以先學習基礎知識。 其實正則表示式並不難,關鍵在於拆分理解,並且經常使用。就可以很好的熟悉正則表示式了。具體語法可參照正則表示式 - JavaScript | MDN 。 正

【python學習筆記】用表示式從含中文的網頁提取資料(含編碼轉換)

目標:用正則表示式從含中文的網頁中提取資料 1、獲得網頁全部資料 1.1思考過程 確定我們要操作的網頁:url = 'http://q.stock.sohu.com/cn/603077/cwzb.shtml' 開啟要操作的網頁:req = urllib2.open(url)

Pythonre(表示式)模組學習

歡迎加入Python學習交流QQ群:535993938  禁止閒聊 ! 名額有限 ! 非喜勿進 ! 關於正則表示式的語法,不作過多解釋,網上有許多學習的資料。這裡主

JS學習(六)表示式

//3.使用正則表示式   //建立一個正則表示式有兩種方式,一種是藉助 RegExp 物件來建立,另一種方式是使  用正則表示式字面量來建立   //字面量   //var regex&n

在Python使用表示式去掉字串裡的html標籤

有時候會獲得一些帶html標籤的字串,需要把html標籤去掉,獲得乾淨的字串,這時候可以使用正則表示式。 程式碼如下: import re htmeString = '''    <ul id="TopNav">    &nbs

淺談js表示式

很多時候多會被正則表示式搞的暈頭轉向,最近抽出時間對正則表示式進行了系統的學習,整理如下: 正則表示式的建立 兩種方法,一種是直接寫,由包含在斜槓之間的模式組成;另一種是呼叫 RegExp 物件的建構函式。 兩種方法的建立程式碼如下: // 直接建立 const regex1 = /ab+c/; co

Python爬蟲學習必備知識點:表示式模組詳解

一、基礎語法總結 1.1、匹配單個字元 a . d D w W s S [...] [^...] 匹配單個字元(.) 規則:匹配除換行之外的任意字元 In [24]: re.findall("f.o","foo is not fao") Out[24]: ['foo',

Python的學習筆記DAY10---關於表示式

        正則表示式用來匹配查詢文字和資料,簡單的說,是一些由字元和特殊符號組成的字串,描述了模式的重複或者表述多個字元。其能按照某種模式匹配一系列有相似特徵的字串。         Python中的正則表

http://www.cnblogs.com/chenmeng0818/p/6370819.html js表示式入門

http://www.cnblogs.com/chenmeng0818/p/6370819.html js中的正則表示式入門   什麼是正則表示式呢? 正則表示式(regular expression)描述了一種字串匹配的模式,可以用來檢查一個字串是否含有某

pycharm使用表示式批量新增print括號

網路下載的python程式碼,版本參差,從python2.x遷移python3.x的過程中,存在print語法問題,即python2.x中print無括號,python3.x中print有括號。 逐行新增括號未免效率過低,因此,可使用正則表示式的方法,提供解決方法。 1、在pychar

Java表示式以及例項

1、 字元  a) x字元x。如‘a’代表字元a  b) \ \反斜線字元用\\代表一個\  c) \n換行符(‘\u000A’)  d) \r回車符(‘\u000D’) 2、 字元類  a) [abc] a、b或c(簡單類)  b) [^abc]除了a、b、c的任何字元  c) [a-zA

Python利用表示式用逗號分割資料,但是忽略引號的逗號的方法

一.問題描述: 我在做一個網站搜尋記錄的分割工作,原始資料如下: x= '{"嬌妻有毒路明": "0.013", "嬌妻有毒%2c陸少寵上癮": "0.078",\ "嬌妻有毒老公你放鬆點": "0.021", "嬌妻有毒陸明白芬": "0.011", "嬌妻有毒:陸少,寵上癮": "0.

Source Insight使用表示式進行高階替換

        問題描述:         程式碼中有個斷言函式,假設叫MyAssert,只有一個引數,用法例如: MyAssert(a >

JS表示式小結

首先,讓我們看看兩個特別的字元:'^' 和'$' 他們是分別用來匹配字串的開始和結束,一下分別舉例說明: "^The": 匹配以"The"開頭的字串; "of despair$": 匹配以"of despair" 結尾的字串

Word使用表示式進行查詢和替換(高效進行文書處理)

術語 開始前,我們先定義一對術語: 萬用字元指的是您可以用來代表一個或多個字元的鍵盤字元。例如,星號 (*) 通常代表一個或多個字元,問號 (?) 通常代表單個字元。 對我們來說,正則表示式指的是您可以用來查詢和替換文字模式的文字字元和萬用字元組合。文字字元指的是必須存在於目標文

powershell表示式

  上文介紹了字串常用的操作,其中替換、匹配等操作僅僅只能實現最簡單的功能,若要對字串進行復雜的操作,比如:匹配出字串中存在的IP地址、電話號碼等其他資訊,字串常用方法就不能實現了,若要解決複雜操作還需要正則表示式出馬。 一、萬用字元    使用正則表示式之前需要先學習一些常用的萬用字元,萬

Java常用表示式

表示式                    含義  \\                  &

JaveScript 表示式

語法:    var expression = /pattern/flags ;   pattern: 任何簡單或複雜的正則表示式。         flags: 可以是 g,i,m 或它們的組合。       g:表示全域性模式,即模式將被應用於所有

Pythonre(表示式)常用函式總結

1  re.match       #嘗試從字串的開始匹配一個模式     re.match的函式原型為:re.match(pattern, string, flags)     第一個引數是正則表示式,這裡為"(\w+)\s",如果匹配成功,則返回一個Match,否則返

JS表示式/RegExp型別總結

  在我看來,正則表示式最主要的作用就是匹配字串,可以用來驗證表單的輸入等功能。不瞭解正則表示式的或者想詳細學學正則表示式的可以參考這篇文章教學:http://deerchao.net/tutorials/regex/regex.htm。   JS通過RegExp型別來支援