var web_development = "python php ruby javascript jsonp perhapsphpisoutdated";
找出其中 包含 p
但不包含 ph
的所有單詞,即
[ 'python', 'javascript', 'jsonp' ]
開始這門課之前,大家先去看兩篇文章。
《正則表達(dá)式30分鐘入門教程》:http://deerchao.net/tutorials/regex/regex.htm
上面這篇介紹了正則表達(dá)式的基礎(chǔ)知識(shí),但是對(duì)于零寬斷言沒有展開來(lái)講,零寬斷言看下面這篇:
《正則表達(dá)式之:零寬斷言不『消費(fèi)』》:http://fxck.it/post/50558232873
好了。
在很久很久以前,有一門語(yǔ)言一度是字符串處理領(lǐng)域的王者,叫 perl。
伴隨著 perl,有一個(gè)類似正則表達(dá)式的標(biāo)準(zhǔn)被實(shí)現(xiàn)了出來(lái),叫 pcre:Perl Compatible Regular Expressions。
不遺憾的是,js 里面的正則與 pcre 不是兼容的。很多語(yǔ)言都這樣。
如果需要測(cè)試你自己寫的正則表達(dá)式,建議上這里:http://refiddle.com/ ,可以所見即所得地調(diào)試。
接下來(lái)我們主要講講 js 中需要注意的地方,至于正則表達(dá)式的內(nèi)容,上面那兩篇文章足夠?qū)W習(xí)了。
第一,
js 中,對(duì)于四種零寬斷言,只支持 零寬度正預(yù)測(cè)先行斷言 和 零寬度負(fù)預(yù)測(cè)先行斷言 這兩種。
第二,
js 中,正則表達(dá)式后面可以跟三個(gè) flag,比如 /something/igm
。
他們的意義分別是,
^
和 $
可以匹配每一行的開頭。分別舉個(gè)例子:
/a/.test('A') // => false
/a/i.test('A') // => true
'hello hell hoo'.match(/h.*?\b/) // => [ 'hello', index: 0, input: 'hello hell hoo' ]
'hello hell hoo'.match(/h.*?\b/g) // => [ 'hello', 'hell', 'hoo' ]
'aaa\nbbb\nccc'.match(/^[\s\S]*?$/g) // => [ 'aaa\nbbb\nccc' ]
'aaa\nbbb\nccc'.match(/^[\s\S]*?$/gm) // => [ 'aaa', 'bbb', 'ccc' ]
與 m 意義相關(guān)的,還有 \A
, \Z
和 \z
他們的意義分別是:
\A 字符串開頭(類似^,但不受處理多行選項(xiàng)的影響)
\Z 字符串結(jié)尾或行尾(不受處理多行選項(xiàng)的影響)
\z 字符串結(jié)尾(類似$,但不受處理多行選項(xiàng)的影響)
在 js 中,g flag 會(huì)影響 String.prototype.match()
和 RegExp.prototype.exec()
的行為
String.prototype.match()
中,返回?cái)?shù)據(jù)的格式會(huì)不一樣,加 g 會(huì)返回?cái)?shù)組,不加 g 則返回比較詳細(xì)的信息
> 'hello hell'.match(/h(.*?)\b/g)
[ 'hello', 'hell' ]
> 'hello hell'.match(/h(.*?)\b/)
[ 'hello',
'ello',
index: 0,
input: 'hello hell' ]
RegExp.prototype.exec()
中,加 g 之后,如果你的正則不是字面量的正則,而是存儲(chǔ)在變量中的話,特么的這個(gè)變量就會(huì)變得有記憶??!
> /h(.*?)\b/g.exec('hello hell')
[ 'hello',
'ello',
index: 0,
input: 'hello hell' ]
> /h(.*?)\b/g.exec('hello hell')
[ 'hello',
'ello',
index: 0,
input: 'hello hell' ]
> var re = /h(.*?)\b/g;
undefined
> re.exec('hello hell')
[ 'hello',
'ello',
index: 0,
input: 'hello hell' ]
> re.exec('hello hell')
[ 'hell',
'ell',
index: 6,
input: 'hello hell' ]
>
第三,
大家知道,.
是不可以匹配 \n
的。如果我們想匹配的數(shù)據(jù)涉及到了跨行,比如下面這樣的。
var multiline = require('multiline');
var text = multiline.stripIndent(function () {
/*
head
code code2 .code3```
```
foot
*/});
如果我們想把兩個(gè) \`\`\` 中包含的內(nèi)容取出來(lái),應(yīng)該怎么辦?
直接用 `.` 匹配不到 `\n`,所以我們需要找到一個(gè)原子,能匹配包括 `\n` 在內(nèi)的所有字符。
這個(gè)原子的慣用寫法就是 `[\s\S]`
var match1 = text.match(/^[\s\S]+?^
/gm);console.log(match1) // => [ '\ncode code2 code3
\n```' ]
// 這里有一種很騷的寫法,[^] 與 [\s\S] 等價(jià)var match2 = text.match(/^[^]+?^
/gm)console.log(match2) // => [ '\ncode code2 .code3
\n```' ]
完。
更多建議: