JavaScript正則表達(dá)式(一)

正則表達(dá)式是一種用來匹配字符串的強(qiáng)有力的武器奈附。它的設(shè)計(jì)思想是用一種描述性的語言來給字符串定義一個(gè)規(guī)則醒串,凡是符合規(guī)則的字符串,我們就認(rèn)為它“匹配”了劫拢,否則胚嘲,該字符串就是不合法的作儿。

初級(jí)

  • 在正則表達(dá)式中,如果直接給出字符馋劈,就是精確匹配攻锰。
  • \\d可以匹配一個(gè)數(shù)字。
    比如00\\d可以匹配007,但是00A就不行啦妓雾。\\d\\d\\d可以匹配123娶吞。
  • \\w可以匹配一個(gè)字母or數(shù)字or下劃線。
    \\w\\w可以匹配A1
  • \\s匹配空白字符械姻。包括空格妒蛇、制表符、換頁符等楷拳。
  • .可以匹配任意字符绣夺。
    js.可以匹配jsp,js!...
  • *表示任意個(gè)字符(包括0個(gè)
  • +表示至少一個(gè)字符
  • ?表示0個(gè)或1個(gè)字符
  • {n}表示n個(gè)字符
    \\d{3}表示匹配三個(gè)數(shù)字,如123
  • {n,m}表示n-m個(gè)字符
  • 特殊字符要用\\轉(zhuǎn)義
    比如要匹配'010-12345'由于'-'是特殊字符欢揖,在正則表達(dá)式中陶耍,要用'\\'轉(zhuǎn)義,所以浸颓,上面的正則是\\d{3}\\-\\d{3,8}
  • 需要轉(zhuǎn)義的字符 * . ? + $ ^ [ ] ( ) { } | \\ /
  • \\b是正則表達(dá)式規(guī)定的一個(gè)特殊代碼(好吧物臂,某些人叫它元字符,metacharacter)产上,代表著單詞的開頭或結(jié)尾棵磷,也就是單詞的分界處。

主要記住常用的\\d數(shù)字晋涣、\\w數(shù)字or字母or下劃線仪媒、\\s空格or制表符or換頁符等的匹配。注意,都是小寫字母哦算吩。

進(jìn)階

  • 更精確的匹配留凭,用[]表示范圍
    [0-9a-zA-Z\\_]可以匹配一個(gè)數(shù)字、字母或者下劃線
    [0-9a-zA-Z\\_]+可以匹配至少一個(gè)數(shù)字偎巢、字母或者下劃線
    [a-zA-Z\\_\\$][0-9a-zA-Z\\_\\$]*可以匹配由字母或下劃線蔼夜、$開頭,后接任意個(gè)由一個(gè)數(shù)字压昼、字母或者下劃線求冷、$組成的字符串,也就是JavaScript允許的變量名
    [a-zA-Z\\_\\$][0-9a-zA-Z\\_\\$]{0, 19}更精確地限制了變量的長度是1-20個(gè)字符,前面1個(gè)字符+后面最多19個(gè)字符
  • A|B 可以匹配A或B
  • ^表示行的開頭窍霞,^\\d表示必須以數(shù)字開頭匠题。
  • $表示行的結(jié)束,\\d$表示必須以數(shù)字結(jié)束但金。

創(chuàng)建RegExp的兩種方式

  • /正則表達(dá)式/直接寫出
  • new RegExp('正則表達(dá)式')創(chuàng)建一個(gè)RegExp對(duì)象
var re1 = /ABC\\-001/;
var re2 = new RegExp('ABC\\\\-001');// 因?yàn)檗D(zhuǎn)義問題韭山,字符串的兩個(gè)\\\\實(shí)際上是一個(gè)\\
re1; // /ABC\\-001/
re2; // /ABC\\-001/

檢測(cè) & RegExp對(duì)象的test()方法

用于檢測(cè)給定的字符串是否符合條件。
注意這是RegExp對(duì)象自己的方法冷溃,還有match()钱磅、search()replace()秃诵、split()都是String對(duì)象的方法续搀。

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

切分字符串

可以用正則表達(dá)式來把不規(guī)范的輸入轉(zhuǎn)化成正確的數(shù)組塞琼。

'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']
//以空白符或者逗號(hào)來分割
'a,b;; c d'.split(/[\\s\\,\\;]+/); // ['a', 'b', 'c', 'd']
//以空白符或者逗號(hào)或者分好來分割

用問號(hào)實(shí)現(xiàn)非貪婪匹配

非貪婪模式盡可能少的匹配所搜索的字符串菠净,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。

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

解決:貪婪表達(dá)式字符的后面加個(gè)非貪婪符號(hào)?
當(dāng)? 緊跟在任何一個(gè)其他限制符 (*, +, ?, {*n*}, {*n*,}, {*n*,*m*}) 后面時(shí)彪杉,匹配模式是非貪婪的毅往。例如,對(duì)于字符串 "oooo"派近,'o+?' 將匹配單個(gè) "o"攀唯,而 'o+' 將匹配所有 'o'

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

分組 & RegExp對(duì)象的exec()方法

如果正則表達(dá)式中定義了組,就可以在RegExp對(duì)象上用exec()方法提取出子串來

  • ()表示的就是要提取的分組(Group)
  • JavaScript exec() 方法
    exec()方法在匹配成功后渴丸,會(huì)返回一個(gè)Array侯嘀,第一個(gè)元素是正則表達(dá)式匹配到的整個(gè)字符串,后面的字符串表示匹配成功的子串谱轨。
    exec()方法在匹配失敗時(shí)返回null戒幔。
    如果在一個(gè)字符串中完成了一次模式匹配之后要開始檢索新的字符串,就必須手動(dòng)地把 lastIndex 屬性重置為 0土童。
var re = /^(\\d{3})-(\\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null
var str = "Visit W3School, W3School is a place to study web technology."; 
var patt = new RegExp("W3School","g");
var result;

while ((result = patt.exec(str)) != null)  {
  document.write(result);
  document.write("<br />");
  document.write(patt.lastIndex);
  document.write("<br />");
 }
輸出:
W3School
14
W3School
24
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诗茎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子献汗,更是在濱河造成了極大的恐慌敢订,老刑警劉巖王污,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異楚午,居然都是意外死亡昭齐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門矾柜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來司浪,“玉大人,你說我怎么就攤上這事把沼“∫祝” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵饮睬,是天一觀的道長租谈。 經(jīng)常有香客問我,道長捆愁,這世上最難降的妖魔是什么割去? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮昼丑,結(jié)果婚禮上呻逆,老公的妹妹穿的比我還像新娘。我一直安慰自己菩帝,他們只是感情好咖城,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呼奢,像睡著了一般宜雀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上握础,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天辐董,我揣著相機(jī)與錄音,去河邊找鬼禀综。 笑死简烘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的定枷。 我是一名探鬼主播孤澎,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼依鸥!你這毒婦竟也來了亥至?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姐扮,沒想到半個(gè)月后絮供,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茶敏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年壤靶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惊搏。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贮乳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恬惯,到底是詐尸還是另有隱情向拆,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布酪耳,位于F島的核電站浓恳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碗暗。R本人自食惡果不足惜颈将,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望言疗。 院中可真熱鬧晴圾,春花似錦、人聲如沸噪奄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梗醇。三九已至知允,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叙谨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工保屯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留手负,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓姑尺,卻偏偏與公主長得像竟终,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子切蟋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容