摘要:當(dāng)我們指定標(biāo)志后,每次運(yùn)行,正則表達(dá)式本身會(huì)更新屬性,表示上次匹配到的最后索引使用全局匹配,直到結(jié)束仍沒(méi)有匹配到全局匹配類似搜索,因此不能使用,那樣只會(huì)最多匹配一次。正則表達(dá)式還可以指定標(biāo)志,表示忽略大小寫,標(biāo)志,表示執(zhí)行多行匹配。
如果有對(duì)字符串進(jìn)行匹配的需求。自然會(huì)想到用正則
如 號(hào)碼:010-8123123
var reg = /^d{3}-d{7}$/" or var reg = new RegExp("^d{3}-d{7}$");//這種寫法因?yàn)樽址霓D(zhuǎn)譯問(wèn)題需要2個(gè)實(shí)際上是1個(gè)
在正則表達(dá)式中,如果直接給出字符,就是精確匹配。用d可以匹配一個(gè)數(shù)字,w可以匹配一個(gè)字母或數(shù)字,所以:
"00d"可以匹配"007",但無(wú)法匹配"00A"; "ffffd"可以匹配"010"; "ww"可以匹配"js"; .可以匹配任意字符,所以: "js."可以匹配"jsp"、"jss"、"js!"等等。
要匹配變長(zhǎng)的字符,在正則表達(dá)式中,用*表示任意個(gè)字符(包括0個(gè)),用+表示至少一個(gè)字符,用?表示0個(gè)或1個(gè)字符,用{n}表示n個(gè)字符,用{n,m}表示n-m個(gè)字符:
來(lái)看一個(gè)復(fù)雜的例子:d{3}s+d{3,8}。 我們來(lái)從左到右解讀一下: d{3}表示匹配3個(gè)數(shù)字,例如"010"; s可以匹配一個(gè)空格(也包括Tab等空白符),所以s+表示至少有一個(gè)空格,例如匹配" "," "等; d{3,8}表示3-8個(gè)數(shù)字,例如"1234567"
進(jìn)階
要做更精確地匹配,可以用[]表示范圍,比如:
[0-9a-zA-Z\_]可以匹配一個(gè)數(shù)字、字母或者下劃線; [0-9a-zA-Z\_]+可以匹配至少由一個(gè)數(shù)字、字母或者下劃線組成的字符串,比如"a100","0_Z","js2015"等等; [a-zA-Z\_$][0-9a-zA-Z\_$]*可以匹配由字母或下劃線、$開頭,后接任意個(gè)由一個(gè)數(shù)字、字母或者下劃線、$組成的字符串,也就是JavaScript允許的變量名; [a-zA-Z\_$][0-9a-zA-Z\_$]{0, 19}更精確地限制了變量的長(zhǎng)度是1-20個(gè)字符(前面1個(gè)字符+后面最多19個(gè)字符)。 A|B可以匹配A或B,所以(J|j)ava(S|s)cript可以匹配"JavaScript"、"Javascript"、"javaScript"或者"javascript"。 ^表示行的開頭,^d表示必須以數(shù)字開頭。 $表示行的結(jié)束,d$表示必須以數(shù)字結(jié)束。 你可能注意到了,js也可以匹配"jsp",但是加上^js$就變成了整行匹配,就只能匹配"js"了。
先看看如何判斷正則表達(dá)式是否匹配:
var re = /^d{3}-d{3,8}$/; re.test("010-12345"); // true re.test("010-1234x"); // false re.test("010 12345"); // false
切分字符串
用正則表達(dá)式切分字符串比用固定的字符更靈活,請(qǐng)看正常的切分代碼:
"a b c".split(" "); // ["a", "b", "", "", "c"]
無(wú)法識(shí)別連續(xù)的空格,用正則表達(dá)式試試:
"a b c".split(/s+/); // ["a", "b", "c"]
無(wú)論多少個(gè)空格都可以正常分割。加入,試試:
"a,b, c d".split(/[s,]+/); // ["a", "b", "c", "d"]
再加入;試試
"a,b;; c d".split(/[s,;]+/); // ["a", "b", "c", "d"]
分組
用()表示的就是要提取的分組(Group)。比如:
^(d{3})-(d{3,8})$ 分別定義了兩個(gè)組,可以直接從匹配的字符串中提取出區(qū)號(hào)和本地號(hào)碼:
var re = /^(d{3})-(d{3,8})$/; re.exec("010-12345"); // ["010-12345", "010", "12345"] re.exec("010 12345"); // null
如果正則表達(dá)式中定義了組,就可以在RegExp對(duì)象上用exec()方法提取出子串來(lái)
exec()方法在匹配成功后,會(huì)返回一個(gè)Array,第一個(gè)元素是正則表達(dá)式匹配到的整個(gè)字符串,后面的字符串表示匹配成功的子串。
exec()方法在匹配失敗時(shí)返回null。
提取子串非常有用。來(lái)看一個(gè)更兇殘的例子:
var re = /^(0[0-9]|1[0-9]|2[0-3]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$/; re.exec("19:05:30"); // ["19:05:30", "19", "05", "30"]
貪婪匹配
需要特別指出的是,正則匹配默認(rèn)是貪婪匹配,也就是匹配盡可能多的字符。舉例如下,匹配出數(shù)字后面的0:
var re = /^(d+)(0*)$/; re.exec("102300"); // ["102300", "102300", ""]
由于d+采用貪婪匹配,直接把后面的0全部匹配了,結(jié)果0*只能匹配空字符串了。
必須讓d+采用非貪婪匹配(也就是盡可能少匹配),才能把后面的0匹配出來(lái),加個(gè)?就可以讓d+采用非貪婪匹配:
var re = /^(d+?)(0*)$/; re.exec("102300"); // ["102300", "1023", "00"]
全局匹配可以多次執(zhí)行exec()方法來(lái)搜索一個(gè)匹配的字符串。當(dāng)我們指定g標(biāo)志后,每次運(yùn)行exec(),正則表達(dá)式本身會(huì)更新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,直到結(jié)束仍沒(méi)有匹配到
全局匹配類似搜索,因此不能使用/^...$/,那樣只會(huì)最多匹配一次。
正則表達(dá)式還可以指定i標(biāo)志,表示忽略大小寫,m標(biāo)志,表示執(zhí)行多行匹配。
轉(zhuǎn)發(fā)自廖雪峰老師的博客:https://www.liaoxuefeng.com/w...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91858.html
摘要:本文內(nèi)容共正則表達(dá)式火拼系列正則表達(dá)式回溯法原理學(xué)習(xí)正則表達(dá)式,是需要懂點(diǎn)兒匹配原理的。正則表達(dá)式迷你書問(wèn)世了讓幫你生成和解析參數(shù)字符串最全正則表達(dá)式總結(jié)驗(yàn)證號(hào)手機(jī)號(hào)中文郵編身份證地址等是正則表達(dá)式的縮寫,作用是對(duì)字符串執(zhí)行模式匹配。 JS 的正則表達(dá)式 正則表達(dá)式 一種幾乎可以在所有的程序設(shè)計(jì)語(yǔ)言里和所有的計(jì)算機(jī)平臺(tái)上使用的文字處理工具。它可以用來(lái)查找特定的信息(搜索),也可以用來(lái)查...
摘要:構(gòu)造函數(shù)可以有兩個(gè)字符串參數(shù),第一個(gè)參數(shù)包含正則表達(dá)式的主體部分。只讀的布爾值,說(shuō)明這個(gè)正則表達(dá)式是否帶有修飾符。中正則的擴(kuò)展構(gòu)造函數(shù)在中,只能接受字符串作為參數(shù),允許其直接接受正則表達(dá)式作為參數(shù)。 上文傳送門:初探正則表達(dá)式 正則表達(dá)式是一個(gè)描述字符模式的對(duì)象,JavaScript 的 RegExp 類表示正則表達(dá)式,String 和 RegExp 都定義了方法,后者使用正則表達(dá)式進(jìn)...
摘要:正則表達(dá)式一直是里比較難以掌握的點(diǎn)。在中創(chuàng)建正則的兩種方式使用字面量這就是正則表達(dá)式的字面量語(yǔ)法,表示正則表達(dá)式的模式,為正則表達(dá)式的標(biāo)志。字面量形式的正則表達(dá)式一般使用較多,也推薦大家盡可能使用這種形式,簡(jiǎn)潔易讀,符合正常的使用習(xí)慣。 正則表達(dá)式一直是js里比較難以掌握的點(diǎn)。 看不懂,學(xué)不會(huì),記不住。 每次需要用到正則的時(shí)候,都需要再去查找資料。 今天花時(shí)間把正則的知識(shí)點(diǎn)總結(jié)下,希望...
摘要:注意本文將正則與中的正則分開討論。正則零寬斷言更多參考各種語(yǔ)言對(duì)于正則不同支持參考單行模式與多行模式通過(guò)設(shè)置正則表達(dá)式后的修飾符可開啟對(duì)應(yīng)的匹配模式單行模式和多行模式。 最近這段時(shí)間幫同學(xué)處理一些文檔, 涉及到一些結(jié)構(gòu)化文檔的工作大部分都得使用正則表達(dá)式, 之前對(duì)于正則的認(rèn)識(shí)大多來(lái)源于語(yǔ)言書上那幾頁(yè)的介紹, 自己也沒(méi)有用過(guò)幾次。這里將我之前感到模糊的概念作個(gè)整理。因?yàn)閷?duì)JS了解多點(diǎn),所...
摘要:選擇分組和引用正則表達(dá)式的語(yǔ)法還包括指定選擇項(xiàng)子表達(dá)式分組和引用前一子表達(dá)式的特殊字符。帶圓括號(hào)的表達(dá)式的另一個(gè)用途是允許在同一正則表達(dá)式的后部引用前面的子表達(dá)式。 正則表達(dá)式(regular expression)是一個(gè)描述字符模式的對(duì)象。JavaScript的 RegExp類 表示正則表達(dá)式,String和RegExp都定義了方法,后者使用正則表達(dá)式進(jìn) 行強(qiáng)大的模式匹配和文本檢索與...
摘要:最全正則表達(dá)式總結(jié)驗(yàn)證號(hào)手機(jī)號(hào)中文郵編身份證地址等是正則表達(dá)式的縮寫,作用是對(duì)字符串執(zhí)行模式匹配。學(xué)習(xí)目標(biāo)了解正則表達(dá)式語(yǔ)法在中使用正則表達(dá)式在中使 JS高級(jí)技巧 本篇是看的《JS高級(jí)程序設(shè)計(jì)》第23章《高級(jí)技巧》做的讀書分享。本篇按照書里的思路根據(jù)自己的理解和經(jīng)驗(yàn),進(jìn)行擴(kuò)展延伸,同時(shí)指出書里的一些問(wèn)題。將會(huì)討論安全的類型檢測(cè)、惰性載入函數(shù)、凍結(jié)對(duì)象、定時(shí)器等話題。1. 安全的類型檢測(cè)...
閱讀 1550·2023-04-26 02:08
閱讀 3139·2021-10-14 09:42
閱讀 7230·2021-09-22 15:34
閱讀 3250·2019-08-30 13:16
閱讀 2752·2019-08-26 13:49
閱讀 1356·2019-08-26 11:59
閱讀 1287·2019-08-26 10:31
閱讀 2178·2019-08-23 17:19