<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
^ 正規表示式的起始符
^tom 表示所有以tom開頭的字串
$ 正規表示式的結束符
lucy$ 表示所有以lucy結束的字串
^$ 結合使用
^tom$ 表示以tom開頭,並以tom結束的字串,只有tom本身
不使用 ^$
tom 表示任何包含 tom 的字串
* 表示出現 0次 或者 至少1次
+ 表示出現 至少1次
? 表示出現 0次 或者 1次
^abc*$ 表示 c 可能出現0次或者至少1次, ab必須出現1次
^bcd+$ 表示 d 至少出現1次,bc必須出現1次
^cba?$ 表示 a 可能出現0次或者1次,cb必須出現1次
^(abc)+$ 表示 abc 這個整體至少出現1次
^[abc]+$ 表示 abc 中任意一個字元,至少出現1次
^ab+c$ 表示 a 必須出現1次 ,b至少出現1次 ,c必須出現1次
使用{m,n} 表示出現次數的範圍
m–至少出現m次
n–最多出現n次
舉例如下
^ab{0,2}$ -- a出現1次,b至少0次,最多2次 ^ab{0,2}$ <====> ^ab*$ ^ab{3}$ -- a出現1次,b出現3次 ^ab{3}$ <====> ^abbb$ ^ab{2,}$ -- a出現1次,b出現至少2次 ^ab{2,}$ <====> ^abb+$
^ab|cd$ -- 表示匹配結果是 ab 或 cd 其中一個
^(bc|df)a$ -- 表示匹配結果是 bca 或 dfa
^(ab|c)*d$ -- 表示匹配結果是 以 ab 開頭或者 c 開頭,中間任意字元,以d結尾
^ab.[0-9]$ -- 表示ab開頭,中間任意1個字元后面是0-9任意一個數位
^[a-z].{3}$ -- 表示a-z中任意一個小寫字母,後面跟三個任意字元
[] 方括號表示某些字元允許在一個字串中某一個特定位置出現
^[ab]$ 表示一個字串中有一個a 或 b <===> ^a|b$
^[a-d]$ 表示一個字串包含小寫 abcdb 中的一個 <==>^[abcd]$<==>^a|b|c$
^[0-9]a$ 表示0-9中任意一個數位後面跟一個小寫字母a
^[a-z]{2}$ 表示a-z中任意的字串總共出現3個
^[A-Z]+$ 表示A-Z中任意一個大寫字母至少出現1次
方括號[]中使用 ^ ,表示不希望出現字元,簡稱過濾字元,而且 ^ 必須用在[]中的第一位
^a[^0-9]%$ 表示 a 和 % 中間不能出現數位
^abc+$ ab 後面 跟著c至少出現一次
^(abc)+$ abc整體至少出現一次
^abc(123|bb)+$ abc 後面跟著 (123|bb)+
^abc123|bb+$ abc123 或者 bb+
這是括號一個重要的作用,有了它,我們就可以進行資料提取,以及更強大的替換操作。
而要使用它帶來的好處,必須配合使用實現環境的API。
以日期為例。假設格式是yyyy-mm-dd的,我們可以先寫一個簡單的正則:
var regex = /d{4}-d{2}-d{2}/; //然後再修改成括號版的: var regex = /(d{4})-(d{2})-(d{2})/;
比如提取出年、月、日,可以這麼做: var regex = /(d{4})-(d{2})-(d{2})/; var string = "2017-06-12"; console.log( string.match(regex) ); // => ["2017-06-12", "2017", "06", "12", index: 0, input: "2017-06-12"] //match返回的一個陣列,第一個元素是整體匹配結果,然後是各個分組(括號裡)匹配的內容,然後是匹配下標,最後是輸入的文字。(注意:如果正則是否有修飾符g,match返回的陣列格式是不一樣的)。 //另外也可以使用正則物件的exec方法: var regex = /(d{4})-(d{2})-(d{2})/; var string = "2017-06-12"; console.log( regex.exec(string) ); // => ["2017-06-12", "2017", "06", "12", index: 0, input: "2017-06-12"] //同時,也可以使用建構函式的全域性屬性$1至$9來獲取: var regex = /(d{4})-(d{2})-(d{2})/; var string = "2017-06-12"; regex.test(string); // 正則操作即可,例如 //regex.exec(string); //string.match(regex); console.log(RegExp.$1); // "2017" console.log(RegExp.$2); // "06" console.log(RegExp.$3); // "12"
比如,想把yyyy-mm-dd格式,替換成mm/dd/yyyy怎麼做?
var regex = /(d{4})-(d{2})-(d{2})/; var string = "2017-06-12"; var result = string.replace(regex, "$2/$3/$1"); console.log(result); // "06/12/2017" //其中replace中的,第二個引數裡用$1、$2、$3指代相應的分組。等價於如下的形式: var regex = /(d{4})-(d{2})-(d{2})/; var string = "2017-06-12"; var result = string.replace(regex, function() { return RegExp.$2 + "/" + RegExp.$3 + "/" + RegExp.$1; }); console.log(result); // "06/12/2017" //也等價於: var regex = /(d{4})-(d{2})-(d{2})/; var string = "2017-06-12"; var result = string.replace(regex, function(match, year, month, day) { return month + "/" + day + "/" + year; }); console.log(result); // "06/12/2017"
還是以日期為例。
比如要寫一個正則支援匹配如下三種格式:
2016-06-12
2016/06/12
2016.06.12
最先可能想到的正則是:
var regex = /d{4}(-|/|.)d{2}(-|/|.)d{2}/; var string1 = "2017-06-12"; var string2 = "2017/06/12"; var string3 = "2017.06.12"; var string4 = "2016-06/12"; console.log( regex.test(string1) ); // true console.log( regex.test(string2) ); // true console.log( regex.test(string3) ); // true console.log( regex.test(string4) ); // true
其中/和.需要跳脫。雖然匹配了要求的情況,但也匹配"2016-06/12"這樣的資料。
假設我們想要求分割符前後一致怎麼辦?此時需要使用反向參照:
var regex = /d{4}(-|/|.)d{2}1d{2}/; var string1 = "2017-06-12"; var string2 = "2017/06/12"; var string3 = "2017.06.12"; var string4 = "2016-06/12"; console.log( regex.test(string1) ); // true console.log( regex.test(string2) ); // true console.log( regex.test(string3) ); // true console.log( regex.test(string4) ); // false
注意裡面的1,表示的參照之前的那個分組(-|/|.)。不管它匹配到什麼(比如-),1都匹配那個同樣的具體某個字元。
我們知道了1的含義後,那麼2和3的概念也就理解了,即分別指代第二個和第三個分組。
看到這裡,此時,恐怕你會有三個問題。
括號巢狀怎麼辦?
以左括號(開括號)為準。比如:
var regex = /^((d)(d(d)))1234$/; var string = "1231231233"; console.log( regex.test(string) ); // true console.log( RegExp.$1 ); // 123 console.log( RegExp.$2 ); // 1 console.log( RegExp.$3 ); // 23 console.log( RegExp.$4 ); // 3
我們可以看看這個正則匹配模式:
第一個字元是數位,比如說1,
第二個字元是數位,比如說2,
第三個字元是數位,比如說3,
接下來的是1,是第一個分組內容,那麼看第一個開括號對應的分組是什麼,是123,
接下來的是2,找到第2個開括號,對應的分組,匹配的內容是1,
接下來的是3,找到第3個開括號,對應的分組,匹配的內容是23,
最後的是4,找到第3個開括號,對應的分組,匹配的內容是3。
這個問題,估計仔細看一下,就該明白了。
10表示什麼呢?
另外一個疑問可能是,即10是表示第10個分組,還是1和0呢?答案是前者,雖然一個正則裡出現10比較罕見。測試如下:
var regex = /(1)(2)(3)(4)(5)(6)(7)(8)(9)(#) 10+/; var string = "123456789# ######" console.log( regex.test(string) );
參照不存在的分組會怎樣?
因為反向參照,是參照前面的分組,但我們在正則裡參照了不存在的分組時,此時正則不會報錯,只是匹配反向參照的字元本身。例如2,就匹配"2"。注意"2"表示對2進行了轉意。
var regex = /123456789/; console.log( regex.test("123456789") ); console.log( "123456789".split("") );
chrome瀏覽器列印的結果:
之前文中出現的分組,都會捕獲它們匹配到的資料,以便後續參照,因此也稱他們是捕獲型分組。
如果只想要括號最原始的功能,但不會參照它,即,既不在API裡參照,也不在正則裡反向參照。此時可以使用非捕獲分組(?:p),例如本文第一個例子可以修改為:
var regex = /(?:ab)+/g; var string = "ababa abbb ababab"; console.log( string.match(regex) ); // ["abab", "ab", "ababab"]
字串trim方法模擬
//trim方法是去掉字串的開頭和結尾的空白符。有兩種思路去做。 //第一種,匹配到開頭和結尾的空白符,然後替換成空字元。如: function trim(str) { return str.replace(/^s+|s+$/g, ''); } console.log( trim(" foobar ") ); // "foobar" //第二種,匹配整個字串,然後用參照來提取出相應的資料: function trim(str) { return str.replace(/^s*(.*?)s*$/g, "$1"); } console.log( trim(" foobar ") ); // "foobar" //這裡使用了惰性匹配*?,不然也會匹配最後一個空格之前的所有空格的。 //當然,前者效率高。
將每個單詞的首字母轉換為大寫
function titleize(str) { return str.toLowerCase().replace(/(?:^|s)w/g, function(c) { return c.toUpperCase(); }); } console.log( titleize('my name is epeli') ); // "My Name Is Epeli" //思路是找到每個單詞的首字母,當然這裡不使用非捕獲匹配也是可以的。
駝峰化
function camelize(str) { return str.replace(/[-_s]+(.)?/g, function(match, c) { return c ? c.toUpperCase() : ''; }); } console.log( camelize('-moz-transform') ); // MozTransform 首字母不會轉化為大寫的。其中分組(.)表示首字母,單詞的界定,前面的字元可以是多個連字元、下劃線以及空白符。正則後面的?的目的,是為了應對str尾部的字元可能不是單詞字元,比如str是'-moz-transform '。
中劃線化
function dasherize(str) { return str.replace(/([A-Z])/g, '-$1').replace(/[-_s]+/g, '-').toLowerCase(); } console.log( dasherize('MozTransform') ); // -moz-transform 駝峰化的逆過程。
html跳脫和反跳脫
// 將HTML特殊字元轉換成等值的實體 function escapeHTML(str) { var escapeChars = { '¢' : 'cent', '£' : 'pound', '¥' : 'yen', '€': 'euro', '©' :'copy', '®' : 'reg', '<' : 'lt', '>' : 'gt', '"' : 'quot', '&' : 'amp', ''' : '#39' }; return str.replace(new RegExp('[' + Object.keys(escapeChars).join('') +']', 'g'), function(match) { return '&' + escapeChars[match] + ';'; }); } console.log( escapeHTML('<div>Blah blah blah</div>') ); // => <div>Blah blah blah</div> //其中使用了用建構函式生成的正則,然後替換相應的格式就行了,這個跟本文沒多大關係。 //倒是它的逆過程,使用了括號,以便提供參照,也很簡單,如下: // 實體字元轉換為等值的HTML。 function unescapeHTML(str) { var htmlEntities = { nbsp: ' ', cent: '¢', pound: '£', yen: '¥', euro: '€', copy: '©', reg: '®', lt: '<', gt: '>', quot: '"', amp: '&', apos: ''' }; return str.replace(/&([^;]+);/g, function(match, key) { if (key in htmlEntities) { return htmlEntities[key]; } return match; }); } console.log( unescapeHTML('<div>Blah blah blah</div>') ); // => <div>Blah blah blah</div> //通過key獲取相應的分組參照,然後作為物件的鍵。
匹配成對標籤
//要求匹配: <title>regular expression</title> <p>laoyao bye bye</p> //不匹配: <title>wrong!</p> //匹配一個開標籤,可以使用正則<[^>]+>, //匹配一個閉標籤,可以使用</[^>]+>, //但是要求匹配成對標籤,那就需要使用反向參照,如: var regex = /<([^>]+)>[dD]*</1>/; var string1 = "<title>regular expression</title>"; var string2 = "<p>laoyao bye bye</p>"; var string3 = "<title>wrong!</p>"; console.log( regex.test(string1) ); // true console.log( regex.test(string2) ); // true console.log( regex.test(string3) ); // false //其中開標籤<[^>]+>改成<([^>]+)>,使用括號的目的是為了後面使用反向參照,而提供分組。閉標籤使用了反向參照,</1>。 //另外[dD]的意思是,這個字元是數位或者不是數位,因此,也就是匹配任意字元的意思。
"^d+$" //非負整數(正整數 + 0) "^[0-9]*[1-9][0-9]*$" //正整數 "^((-d+)|(0+))$" //非正整數(負整數 + 0) "^-[0-9]*[1-9][0-9]*$" //負整數 "^-?d+$" //整數 "^d+(.d+)?$" //非負浮點數(正浮點數 + 0) "^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮點數 "^((-d+(.d+)?)|(0+(.0+)?))$" //非正浮點數(負浮點數 + 0) "^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //負浮點數 "^(-?d+)(.d+)?$" //浮點數 "^[A-Za-z]+$" //由26個英文字母組成的字串 "^[A-Z]+$" //由26個英文字母的大寫組成的字串 "^[a-z]+$" //由26個英文字母的小寫組成的字串 "^[A-Za-z0-9]+$" //由數位和26個英文字母組成的字串 "^w+$" //由數位、26個英文字母或者下劃線組成的字串 "^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$" //email地址 "^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$" //url /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日 /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年 "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //電話號碼 "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址 ^([0-9A-F]{2})(-[0-9A-F]{2}){5}$ //MAC地址的正規表示式 ^[-+]?d+(.d+)?$ //值型別正規表示式 "^\d+$" //非負整數(正整數 + 0) "^[0-9]*[1-9][0-9]*$" //正整數 "^((-\d+)|(0+))$" //非正整數(負整數 + 0) "^-[0-9]*[1-9][0-9]*$" //負整數 "^-?\d+$" //整數 "^\d+(\.\d+)?$" //非負浮點數(正浮點數 + 0) "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮點數 "^((-\d+(\.\d+)?)|(0+(\.0+)?))$" //非正浮點數(負浮點數 + 0) "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //負浮點數 "^(-?\d+)(\.\d+)?$" //浮點數 "^[A-Za-z]+$" //由26個英文字母組成的字串 "^[A-Z]+$" //由26個英文字母的大寫組成的字串 "^[a-z]+$" //由26個英文字母的小寫組成的字串 "^[A-Za-z0-9]+$" //由數位和26個英文字母組成的字串 "^\w+$" //由數位、26個英文字母或者下劃線組成的字串 "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$" //email地址 "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$" //url
https://www.jb51.net/article/73342.htm
https://zhuanlan.zhihu.com/p/27355118
到此這篇關於正規表示式的基本語法的文章就介紹到這了,更多相關正規表示式語法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45