js的RegExp

來源:互聯網
上載者:User

標籤:包括   本地   建立   特殊字元   jsp   注意   成功   定義   字串表   

Regex是一種用來匹配字串的強有力的武器。它的設計思想是用一種描述性的語言來給字串定義一個規則,凡是符合規則的字串,我們就認為它“匹配”了,否則,該字串就是不合法的。

所以我們判斷一個字串是否是合法的Email的方法是:

  1. 建立一個匹配Email的Regex;

  2. 用該Regex去匹配使用者的輸入來判斷是否合法。

在Regex中,如果直接給出字元,就是精確匹配。用\d可以匹配一個數字,\w可以匹配一個字母或數字,所以:

  • ‘00\d‘可以匹配‘007‘,但無法匹配‘00A‘

  • ‘\d\d\d‘可以匹配‘010‘

  • ‘\w\w‘可以匹配‘js‘

.可以匹配任一字元,所以:

  • ‘js.‘可以匹配‘jsp‘‘jss‘‘js!‘等等。

要匹配變長的字元,在Regex中,用*表示任意個字元(包括0個),用+表示至少一個字元,用?表示0個或1個字元,用{n}表示n個字元,用{n,m}表示n-m個字元:

來看一個複雜的例子:\d{3}\s+\d{3,8}

我們來從左至右解讀一下:

  1. \d{3}表示匹配3個數字,例如‘010‘

  2. \s可以匹配一個空格(也包括Tab等空白符),所以\s+表示至少有一個空格,例如匹配‘ ‘‘\t\t‘等;

  3. \d{3,8}表示3-8個數字,例如‘1234567‘

綜合起來,上面的Regex可以匹配以任意個空格隔開的帶區號的電話號碼。

如果要匹配‘010-12345‘這樣的號碼呢?由於‘-‘是特殊字元,在Regex中,要用‘\‘轉義,所以,上面的正則是\d{3}\-\d{3,8}

但是,仍然無法匹配‘010 - 12345‘,因為帶有空格。所以我們需要更複雜的匹配方式。

進階

要做更精確地匹配,可以用[]表示範圍,比如:

  • [0-9a-zA-Z\_]可以匹配一個數字、字母或者底線;

  • [0-9a-zA-Z\_]+可以匹配至少由一個數字、字母或者底線組成的字串,比如‘a100‘‘0_Z‘‘js2015‘等等;

  • [a-zA-Z\_\$][0-9a-zA-Z\_\$]*可以匹配由字母或底線、$開頭,後接任意個由一個數字、字母或者底線、$組成的字串,也就是JavaScript允許的變數名;

  • [a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}更精確地限制了變數的長度是1-20個字元(前面1個字元+後面最多19個字元)。

A|B可以匹配A或B,所以(J|j)ava(S|s)cript可以匹配‘JavaScript‘‘Javascript‘‘javaScript‘或者‘javascript‘

^表示行的開頭,^\d表示必須以數字開頭。

$表示行的結束,\d$表示必須以數字結束。

你可能注意到了,js也可以匹配‘jsp‘,但是加上^js$就變成了整行匹配,就只能匹配‘js‘了。

RegExp

有了準備知識,我們就可以在JavaScript中使用Regex了。

JavaScript有兩種方式建立一個Regex:

第一種方式是直接通過/Regex/寫出來,第二種方式是通過new RegExp(‘Regex‘)建立一個RegExp對象。

兩種寫法是一樣的:

var re1 = /ABC\-001/;var re2 = new RegExp(‘ABC\\-001‘);re1; // /ABC\-001/re2; // /ABC\-001/
注意,如果使用第二種寫法,因為字串的轉義問題,字串的兩個\\實際上是一個\

先看看如何判斷Regex是否匹配:

var re = /^\d{3}\-\d{3,8}$/;re.test(‘010-12345‘); // truere.test(‘010-1234x‘); // falsere.test(‘010 12345‘); // false
切分字串

用Regex切分字串比用固定的字元更靈活,請看正常的切分代碼:

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

嗯,無法識別連續的空格,用Regex試試:

‘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‘]

分組

Regex還有提取子串的強大功能。用()表示的就是要提取的分組(Group)。比如:

^(\d{3})-(\d{3,8})$分別定義了兩個組,可以直接從匹配的字串中提取出區號和本地號碼:

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

如果Regex中定義了組,就可以在RegExp對象上用exec()方法提取出子串來。

exec()方法在匹配成功後,會返回一個Array,第一個元素是Regex匹配到的整個字串,後面的字串表示匹配成功的子串。

exec()方法在匹配失敗時返回null

貪婪匹配
var re = /^(\d+)(0*)$/;re.exec(‘102300‘); // [‘102300‘, ‘102300‘, ‘‘]

由於\d+採用貪婪匹配,直接把後面的0全部匹配了,結果0*只能匹配Null 字元串了。

必須讓\d+採用非貪婪匹配(也就是儘可能少匹配),才能把後面的0匹配出來,加個?就可以讓\d+採用非貪婪匹配:

var re = /^(\d+?)(0*)$/;re.exec(‘102300‘); // [‘102300‘, ‘1023‘, ‘00‘]
 

js的RegExp

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.