在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ (^( )?(if|for|else|switch|case|break|{|}

(^( )?(if|for|else|switch|case|break|{|}))(.*)?這個(gè)正則什么意思?

1.我不太理解第一個(gè)問號(hào)前面是匹配什么的?以空格開頭?這個(gè)正則功能是用來匹配js的那幾個(gè)關(guān)鍵詞的,但是我不知道這么寫的原理,原文鏈接在這里傳送門

回答
編輯回答
有你在

看這個(gè)例子,模板引擎的語法應(yīng)該是類似于這種:<%%>,在<%的后面和%>的前面可以沒有空格,也可以有一個(gè)空格,比如<%name%><% name %>應(yīng)該被認(rèn)為是一樣的,所以為了滿足這個(gè)需求,前面需要添加一個(gè)( )?,( )表示匹配一個(gè)空格,?表示前面的重復(fù)0到1次,所以( )?的意思就是說可以有一個(gè)空格,也可以沒有。

結(jié)合代碼,里面有兩個(gè)正則:

var re = /<%([^%>]+)?%>/g,
    re2 = /(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g;
...
while (match = re.exec(tpl)) {
    add(tpl.slice(cursor, match.index));
    re2.test(match[1]) ? add(match[1], true) : add("this." + match[1], true);
    cursor = match.index + match[0].length;
}

第一個(gè)正則會(huì)匹配<%%>然后把<%%>之間的內(nèi)容保存下來,第二個(gè)正則正好會(huì)處理第一個(gè)正則保存下來的內(nèi)容。
while循環(huán)中,首先用第一個(gè)re去匹配(match = re.exec(tpl)),然后<%%>之間的內(nèi)容被保存在match[1]中,然后用re2去匹配(re2.test(match[1]))。
注意,re<%%>之間的內(nèi)容全部放在match[1]中了,所以如果是<%name%>那么match[1]中的就是"name",但是如果是<% name %>那么match[1]中的就是" name ",所以需要使用( )?來處理一下空格。

2018年7月19日 01:15