[JavaScript] (Day-14) - RegExp 正則表達式

Happiness is when the desolated soul meets love. 幸福是孤寂的靈魂遭遇愛的邂逅。

正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。

它不限于任何語言

正則表達式-百度百科


下面對正則進簡要介紹:

方括號

方括號([])用于正則表達式的上下文中時有特殊意義,用來查找一系列字符

表達 描述
[...] 查找方括號之間的任何字符
[^...] 查找任何不在方括號之間的字符
[0-9] 查找任何從 0 至 9 的數字
[a-z] 查找任何小寫 a 到小寫 z 的字符
[A-Z] 查找任何大寫 A 到大寫 Z 的字符
[a-Z] 查找任何小寫 a 到大寫 Z 的字符

解讀:

  • [0-9a-zA-Z\_]可以匹配一個數字、字母或者下劃線;
  • [0-9a-zA-Z\_]+可以匹配至少由一個數字、字母或者下劃線組成的字符串,比如'a100''0_Z','js2015'等等;
  • [a-zA-Z\_\$][0-9a-zA-Z\_\$]*可以匹配由字母或下劃線、$開頭,后接任意個由一個數字、字母或者下劃線、$組成的字符串
  • [a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}更精確地限制了變量的長度是1-20個字符(前面1個字符+后面最多19個字符)。

量詞

方括號括起來的字符序列或單個字符出現的頻率或位置可以用一個特殊的符號來表示。每個特殊字符都有一個特定的含義。+、*、? 和 $ 符號都遵循一個字符序列模式

表達 描述
p+ 匹配任何包含至少一個 p 的字符串
p* 匹配任何包含零個或多個 p 的字符串
p? 匹配任何包含零個或一個 p 的字符串
p{N} 匹配包含 N 個 p 的序列字符串
p{2,3} 匹配包含 2 或 3 個 p 的序列的字符串
p{2,} 匹配包含至少 2 個 p 的序列的字符串
p$ 匹配任何結尾為 p 的字符串
^p 匹配任何開頭為 p 的字符串

元字符

字符 描述
. 單個字符
\s 空白字符(空格、制表符、換行符)
\S 非空白字符
\d 數字字符(0-9)
\D 非數字字符
\w 單詞字符(a-z,A-Z,0-9,_)
\W 非單詞字符
[\b] 一個文字退格(特殊情況)
[aeiou] 匹配一個在給定集合內的字符
[^aeiou] 匹配一個不在給定集合內的字符
[foo|bar|baz] 匹配任何指定的備選方案

解讀:

  • '00\d'可以匹配'007',但無法匹配'00A';
  • '\d\d\d'可以匹配'010'
  • '\w\w'可以匹配'js';
  • 'js.'可以匹配'jsp'、'jss''js!'等等。

解讀\d{3}\-\d{3,8}表達式
1、\d{3} 表示匹配三個數字,例如123, 010
2、\- 表示匹配特殊字符-
3、\d{3,8}表示3到8個數字,例如 1234567

綜上所述:可以匹配 010-88888888, 021-12345678


RegExp方法

方法 描述
exec() 檢索字符串中指定的值。返回找到的值,并確定其位置
test() 檢索字符串中指定的值。返回 ture 或 false
toSource 返回一個對象字面值代表指定的對象;您可以使用這個值來創建一個新的對象。
toString() 返回一個代表指定對象的字符串。

JavaScript 中正則表達式的使用

RegExp() 構造函數定義

方式一

var pattern = new RegExp(pattern, attributes);

方式二

var patter = /pattern/attributes;

pattern:是一個字符串,指定了正則表達式的模式或其他正則表達式。
attributes:是一個可選的字符串,包含屬性 "g"、"i" 和 "m",分別用于指定全局匹配、區分大小寫的匹配和多行匹配。

兩種寫法是一樣的

實例:

var re1 = /ABC\-001/;
var re2 = new RegExp('ABC\\-001');

re1; // /ABC\-001/
re2; // /ABC\-001/

如果使用第二種寫法,因為字符串的轉義問題,字符串的兩個\\實際上是一個\。
RegExp對象的test()方法用于測試給定的字符串是否符合條件,返回 true 和 false

var re = /^\d{3}\-\d{3,8}$/;
re.test('010-12345'); // true
re.test('010-1234x'); // false
re.test('010 12345'); // false


切分字符串

'a b   c'.split(' '); // ['a', 'b', '', '', 'c']

無法識別連續的空格,用正則表達式試試:

'a b   c'.split(/\s+/); // ['a', 'b', 'c']

無論多少個空格都可以正常分割。加入,試試:

'a,b, c  d'.split(/[\s\,]+/); // ['a', 'b', 'c', 'd']

再加入;試試:

'a,b;; c  d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd']


分組

用()表示的就是要提取的分組(Group)

var re = /^(\d{3})-(\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null

全局搜索

JavaScript的正則表達式還有幾個特殊的標志,最常用的是g,表示全局匹配:

var r1 = /test/g;
// 等價于:
var r2 = new RegExp('test', 'g');

全局匹配可以多次執行exec()方法來搜索一個匹配的字符串。當我們指定g標志后,每次運行exec(),正則表達式本身會更新lastIndex屬性,表示上次匹配到的最后索引:

var s = 'JavaScript, VBScript, JScript and ECMAScript';
var re=/[a-zA-Z]+Script/g;

// 使用全局匹配:
re.exec(s); // ['JavaScript']
re.lastIndex; // 10

re.exec(s); // ['VBScript']
re.lastIndex; // 20

re.exec(s); // ['JScript']
re.lastIndex; // 29

re.exec(s); // ['ECMAScript']
re.lastIndex; // 44

re.exec(s); // null,直到結束仍沒有匹配到
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 初衷:看了很多視頻、文章,最后卻通通忘記了,別人的知識依舊是別人的,自己卻什么都沒獲得。此系列文章旨在加深自己的印...
    DCbryant閱讀 4,064評論 0 20
  • 正則表達式到底是什么東西?字符是計算機軟件處理文字時最基本的單位,可能是字母,數字,標點符號,空格,換行符,漢字等...
    獅子挽歌閱讀 2,174評論 0 9
  • 推薦幾個正則表達式編輯器 Debuggex :https://www.debuggex.com/ PyRegex:...
    木易林1閱讀 11,541評論 9 151
  • 幾個正則表達式編輯器 Debuggex :https://www.debuggex.com/ PyRegex:ht...
    沒技術的BUG開發攻城獅閱讀 4,618評論 0 23
  • 正則表達式 \n\n\n 【5】正則表達式應用——刪除空行 啟動EditPlus,打開待處理的文本類型文件。 ①、...
    黃花菜已涼閱讀 1,070評論 0 4