国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

常見的正則使用備忘

yedf / 651人閱讀

摘要:也叫零寬度正回顧后發(fā)斷言,它斷言自身出現(xiàn)的位置的前面能匹配表達式。同時使用了兩種斷言匹配以空白符間隔的數(shù)字再次強調(diào),不包括這些空白符。

緣起

正則表達式就是一把利器,拿出來的時候往往無往不利, 但是我們常常卻將之束之高閣, 只因她不是那么漂亮,不那么讓人印象深刻.

基礎(chǔ)知識

常用元字符

標(biāo)識 說明
. 匹配除換行符以外的任意字符
w 匹配字母或數(shù)字或下劃線或漢字, 若僅限英文等價于[a-z0-9A-Z_]
s 匹配任意的空白符,包括空格,制表符(Tab),換行符,中文全角空格等
d 匹配數(shù)字
 匹配單詞的開始或結(jié)束
^ 匹配字符串的開始
$ 匹配字符串的結(jié)束

反義字符

標(biāo)識 說明
W 匹配任意不是字母,數(shù)字,下劃線,漢字的字符
S 匹配任意不是空白符的字符
D 匹配任意非數(shù)字的字符
B 匹配不是單詞開頭或結(jié)束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou這幾個字母以外的任意字符

重復(fù)

標(biāo)識 說明
* 重復(fù)零次或更多次
+ 重復(fù)一次或更多次
? 重復(fù)零次或一次
{n} 重復(fù)n次
{n,} 重復(fù)n次或更多次
{n,m} 重復(fù)n到m次

分支條件 |

為了解決類似下面的問題
(?0d{2}[) -]?d{8} 匹配類似(010)88886666,或022-22334455,或02912345678等電話號碼. 首先是一個轉(zhuǎn)義字符(,它能出現(xiàn)0次或1次(?),然后是一個0,后面跟著2個數(shù)字(d{2}),然后是)或-或空格中的一個,它出現(xiàn)1次或不出現(xiàn)(?),最后是8個數(shù)字(d{8})

分支條件就是將能夠涉及到的所有情況都通過|列舉出來, 相當(dāng)于程序代碼的||, 如果前部分滿足條件, 則不會在判斷后部分.

0d{2}-d{8}|0d{3}-d{7}這個表達式能匹配兩種以連字號分隔的電話號碼:一種是三位區(qū)號,8位本地號(如010-12345678),一種是4位區(qū)號,7位本地號(0376-2233445)。
(0d{2})[- ]?d{8}|0d{2}[- ]?d{8} 匹配3位區(qū)號的電話號碼,其中區(qū)號可以用小括號括起來,也可以不用,區(qū)號與本地號間可以用連字號或空格間隔,也可以沒有間隔

分組
使用()將滿足條件的表達式隔離出來作為獨立的一部分
如:
(d{1,3}.){3}d{1,3}
((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)
2[0-4]d|25[0-5]|[01]?dd?當(dāng)作一個整體即可

一些示例

aw*匹配以字母a開頭的單詞——先是某個單詞開始處(b),然后是字母a,然后是任意數(shù)量的字母或數(shù)字(w*),最后是單詞結(jié)束處()

d+匹配1個或更多連續(xù)的數(shù)字。這里的+是和類似的元字符,不同的是匹配重復(fù)任意次(可能是0次),而+則匹配重復(fù)1次或更多次。

w{6} 匹配剛好6個字符的單詞

零寬斷言
查找在某些內(nèi)容(但并不包括這些內(nèi)容)之前或之后的東西,也就是說它們像,^,$那樣用于指定一個位置,這個位置應(yīng)該滿足一定的條件(即斷言).

標(biāo)識 說明
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(? 匹配前面不是exp的位置

(?=exp)也叫零寬度正預(yù)測先行斷言,它斷言自身出現(xiàn)的位置的后面能匹配表達式exp。比如w+(?=ing),匹配以ing結(jié)尾的單詞的前面部分(除了ing以外的部分),如查找I"m singing while you"re dancing.時,它會匹配sing和danc。

(?<=exp)也叫零寬度正回顧后發(fā)斷言,它斷言自身出現(xiàn)的位置的前面能匹配表達式exp。比如(?<=re)w+會匹配以re開頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時,它匹配ading。

(?<=s)d+(?=s),同時使用了兩種斷言, 匹配以空白符間隔的數(shù)字(再次強調(diào),不包括這些空白符)。

為了解決:
w*q[^u]w*匹配包含后面不是字母u的字母q的單詞。但是如果多做測試(或者你思維足夠敏銳,直接就觀察出來了),你會發(fā)現(xiàn),如果q出現(xiàn)在單詞的結(jié)尾的話,像Iraq,Benq,這個表達式就會出錯。這是因為[^u]總要匹配一個字符,所以如果q是單詞的最后一個字符的話,后面的[^u]將會匹配q后面的單詞分隔符(可能是空格,或者是句號或其它的什么),后面的w*b將會匹配下一個單詞,于是w*q[^u]w*就能匹配整個Iraq fighting。負(fù)向零寬斷言能解決這樣的問題,因為它只匹配一個位置,并不消費任何字符。現(xiàn)在,我們可以這樣來解決這個問題:w*q(?!u)w*

(?!exp)也叫零寬度負(fù)預(yù)測先行斷言, 斷言此位置的后面不能匹配表達式exp, d{3}(?!d)匹配三位數(shù)字,而且這三位數(shù)字的后面不能是數(shù)字;((?!abc)w)+匹配不包含連續(xù)字符串a(chǎn)bc的單詞。

(?也叫零寬度負(fù)回顧后發(fā)斷言, 斷言此位置的前面不能匹配表達式exp:(?

一個更復(fù)雜的例子:(?<=<(w+)>).*(?=)匹配不包含屬性的簡單HTML標(biāo)簽內(nèi)里的內(nèi)容。(?<=<(w+)>)指定了這樣的前綴:被尖括號括起來的單詞(比如可能是),然后是.*(任意的字符串),最后是一個后綴(?=)。注意后綴里的/,它用到了前面提過的字符轉(zhuǎn)義;1則是一個反向引用,引用的正是捕獲的第一組,前面的(w+)匹配的內(nèi)容,這樣如果前綴實際上是的話,后綴就是了。整個表達式匹配的是之間的內(nèi)容(再次提醒,不包括前綴和后綴本身)。

貪婪與懶惰
貪婪: 盡可能匹配最長的字符串
懶惰: 匹配滿足條件的第一個字符串

懶惰限定符

標(biāo)識 說明
*? 重復(fù)任意次,但盡可能少重復(fù)
+? 重復(fù)1次或更多次,但盡可能少重復(fù)
?? 重復(fù)0次或1次,但盡可能少重復(fù)
{n,m}? 重復(fù)n到m次,但盡可能少重復(fù)
{n,}? 重復(fù)n次以上,但盡可能少重復(fù)

a.*?b匹配最短的,以a開始,以b結(jié)束的字符串。如果把它應(yīng)用于aabab的話,它會匹配aab(第一到第三個字符)和ab(第四到第五個字符)

為什么第一個匹配是aab(第一到第三個字符)而不是ab(第二到第三個字符)?簡單地說,因為正則表達式有另一條規(guī)則,比懶惰/貪婪規(guī)則的優(yōu)先級更高:最先開始的匹配擁有最高的優(yōu)先權(quán)——The match that begins earliest wins。
關(guān)鍵字

match

語法: str.match(reg), 參數(shù)可傳入字符串或者正則表達式.
關(guān)鍵注意正則表達式是否攜帶g, 判斷實現(xiàn)全局匹配.

如果匹配成功, 返回匹配的值, 取返回數(shù)據(jù)的[0]元素; 如果失敗,返回null

var str = "aaabbbcccffffdeeefff";
strResult = str.match(/aaa(S*)fff/);
console.log(strResult);
/*
返回一個類數(shù)組, 可使用Array.prototype.slice.call(strResult)轉(zhuǎn)化為真正的數(shù)組
["aaabbbcccffffdeeefff", "bbbcccffffdeee", index: 0, input: "aaabbbcccffffdeeefff", groups: undefined]
["原字符串",            "截取出來的字符串",  "位置編碼",  "輸入",                   "組"]
*/

exec

語法:reg.exec(str)
檢索字符串中指定的值。匹配成功返回一個數(shù)組,匹配失敗返回null。

test

直接用來判斷是否正確, 比較簡單

compile

compile() 方法用于改變 RegExp。
compile() 既可以改變檢索模式,也可以添加或刪除第二個參數(shù)。

var reg=/hello/;
console.log(reg.exec("hellojs"));//["hello"]
reg.compile("Hello");
console.log(reg.exec("hellojs"));//null
reg.compile("Hello","i");
console.log(reg.exec("hellojs"));//["hello"]
matchexec對比

相似點:
match和exec在匹配成功時返回的都是數(shù)組,在沒有匹配上時返回的都是null

不同點
1.全局匹配
當(dāng)不使用全局匹配的時候,matchexec基本一致

var s = "aaa bbb ccc";
var reg = /w+/;//沒有g(shù)
var rs_match = s.match(reg);
var rs_exec = reg.exec(s);
console.log("match:",rs_match);
console.log("exec:",rs_exec);

當(dāng)使用全局匹配的時候,matchexec返回數(shù)據(jù)不同
match直接以數(shù)組的形式返回匹配的所有數(shù)據(jù)
exec返回的數(shù)據(jù)的格式和未使用全局匹配一致, 但是是逐個匹配目標(biāo)字符串. 返回的index下標(biāo)能夠獲取第幾個匹配的初始位置.

var s = "aaa bbb ccc";
var reg = /w+/g;//有g(shù)
var rs_match1 = s.match(reg);
var rs_match2 = s.match(reg);
var rs_exec1 = reg.exec(s);
var rs_exec2 = reg.exec(s);
console.log("match1:",rs_match1);
console.log("match2:",rs_match1);
console.log("exec1:",rs_exec1);
console.log("exec2:",rs_exec2);

2.分組
無全局匹配分組時,match和exec返回結(jié)果相同。
由于正則表達式采用了括號分組,所以在返回匹配結(jié)果的同時,依次返回該結(jié)果的所有分組, 如上面示例str.match(/aaa(S*)fff/)返回結(jié)果, 類數(shù)組的第二個元素就是分組(()中的數(shù)據(jù))的元素.

var s = "aaa1 bbb2 ccc3";
var reg = /(w+)(d{1})/;//兩個分組,無g
var rs_match1 = s.match(reg);
var rs_match2 = s.match(reg);
var rs_exec1 = reg.exec(s);
var rs_exec2 = reg.exec(s);
console.log("match1:",rs_match1);
console.log("match2:",rs_match1);
console.log("exec1:",rs_exec1);
console.log("exec2:",rs_exec2);

全局匹配分組時,match和exec返回結(jié)果不同。
match會返回所有匹配到的結(jié)果;
exec會返回本次匹配到的結(jié)果,若表達式中出現(xiàn)分組,則會依次返回本次匹配的全部分組:

var s = "aaa1 bbb2 ccc3";
var reg = /(w+)(d{1})/g;
var rs_match1 = s.match(reg);
var rs_match2 = s.match(reg);
var rs_exec1 = reg.exec(s);
var rs_exec2 = reg.exec(s);
var rs_exec3 = reg.exec(s);
var rs_exec4 = reg.exec(s);
console.log("match1:",rs_match1);
console.log("match2:",rs_match1);
console.log("exec1:",rs_exec1);
console.log("exec2:",rs_exec2);
console.log("exec3:",rs_exec3);
console.log("exec4:",rs_exec4);

replace使用

正則表達式構(gòu)造函數(shù):new RegExp("pattern"[,"flags"]);
正則表達式替換變量函數(shù):stringObj.replace(RegExp, replace Text);

//下面的例子用來獲取url的兩個參數(shù),并返回urlRewrite之前的真實Url
var reg=new RegExp("(http://www.qidian.com/BookReader/)(d+),(d+).aspx","gmi");
var url="http://www.qidian.com/BookReader/1017141,20361055.aspx";

//方式一,最簡單常用的方式
var rep=url.replace(reg,"$1ShowBook.aspx?bookId=$2&chapterId=$3");
console.log(rep); // http://www.qidian.com/BookReader/ShowBook.aspx?bookId=1017141&chapterId=20361055

//方式二 ,采用固定參數(shù)的回調(diào)函數(shù)
var rep2=url.replace(reg,function(m,p1,p2,p3){
  console.log("mmmm => ", m, p1,p2,p3)
  return p1+"ShowBook.aspx?bookId="+p3+"&chapterId="+p3
});
alert(rep2);

//方式三,采用非固定參數(shù)的回調(diào)函數(shù)
var rep3=url.replace(reg,function(){var args=arguments; return args[1]+"ShowBook.aspx?bookId="+args[2]+"&chapterId="+args[3];});
alert(rep3);

//方法四
//方式四和方法三很類似, 除了返回替換后的字符串外,還可以多帶帶獲取參數(shù)
var bookId;
var chapterId;
function capText()
{
    var args=arguments;
    bookId=args[2];
    chapterId=args[3];
    return args[1]+"ShowBook.aspx?bookId="+args[2]+"&chapterId="+args[3];
}

var rep4=url.replace(reg,capText);
alert(rep4);
alert(bookId);
alert(chapterId);

//使用test方法獲取分組
var reg3=new RegExp("(http://www.qidian.com/BookReader/)(d+),(d+).aspx","gmi");
reg3.test("http://www.qidian.com/BookReader/1017141,20361055.aspx");
//獲取三個分組
console.log(RegExp.$0)
console.log(RegExp.$1); // http://www.qidian.com/BookReader/
console.log(RegExp.$2); // 1017141
console.log(RegExp.$3); // 20361055
參考文檔

探究js正則匹配方法:match和exec

正則表達式30分鐘入門教程

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/98529.html

相關(guān)文章

  • 第6章:可維護性軟件構(gòu)建方法 6.3可維護性構(gòu)建技術(shù)

    摘要:遵循特定規(guī)則,利用操作符,終止節(jié)點和其他非終止節(jié)點,構(gòu)造新的字符串非終結(jié)符是表示字符串的樹的內(nèi)部節(jié)點。語法中的生產(chǎn)具有這種形式非終結(jié)符終結(jié),非終結(jié)符和運算符的表達式語法的非終結(jié)點之一被指定為根。 大綱 基于狀態(tài)的構(gòu)建 基于自動機的編程 設(shè)計模式:Memento提供了將對象恢復(fù)到之前狀態(tài)的功能(撤消)。 設(shè)計模式:狀態(tài)允許對象在其內(nèi)部狀態(tài)改變時改變其行為。 表驅(qū)動結(jié)構(gòu)* 基于語法的構(gòu)...

    young.li 評論0 收藏0
  • JS常用正則表達式備忘

    摘要:想閱讀更多優(yōu)質(zhì)文章請猛戳博客一年百來篇優(yōu)質(zhì)文章等著你正則表達式或用于匹配字符串的各個部分下面是我創(chuàng)建正則表達式的備忘單。 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 正則表達式或regex用于匹配字符串的各個部分 下面是我創(chuàng)建正則表達式的備忘單。 匹配正則 使用 .test() 方法 let testString = My test string; let t...

    reclay 評論0 收藏0
  • 【譯】Nodejs應(yīng)用安全備忘

    摘要:所以我們整理了一個應(yīng)用安全備忘錄,以幫助你在部署啟動應(yīng)用程序的時候進行安全檢查。這可以保護應(yīng)用程序不被攻擊。應(yīng)該用日志記錄下來,而不是顯示給用戶。 本人的博客http://www.wjs.photo/,感興趣的可以看看哦,基于NodeJs框架ThinkJs 本文翻譯自 www.risingstack.com ,并非逐字逐句的翻譯,有錯誤的地方請指出,謝謝啦 應(yīng)用程序的安全就像是你房間里...

    Loong_T 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<