關于反向引用
復制代碼代碼如下:
// 測試函數
function matchReg(reg, str) {
var result = str.match(reg);
if(result) {
console.dir(result);
} else {
console.log('match failed');
}
}
var reg = /([A-Za-z]{0,6})/1/;
var str = 'AndrewAndrew';
// 測試通過
matchReg(reg, str);
//通過(?:pattern)的方式,不記錄子表達式匹配的內容(本例中為Andrew)
//所以/1對子表達式匹配內容的引用失敗了
//注意:這里強調的是子表達式所匹配的內容,而不是子表達式本身
reg = /(?:[a-zA-Z]{0,6})/1/;
// 測試不通過
matchReg(reg, str);
關于子表達式的定義
var parse_number = /^-?/d+(?:/./d*)?(?:e[+/-]?/d+)?$/i;
這是一個解析數字的正則表達式,其中的子表達式有(?:/./d*)和(?:e[+/-]?/d+)
/.和/-分別是對.和-的轉義表達
順便復習下.表示除換行符以外的其他字符
-一般用于[a-zA-Z0-9]表示匹配范圍
如果其中沒?:例如(/./d*)那么按照先后順序,反向引用的關系如下
/1-->(/./d*)
/2-->(e[+/-]?/d+)
如果有更多的話,就以此類推/3 /4 /5....
再次強調,引用的是子表達式匹配的內容,是具體的文本
關于正向預查
復制代碼代碼如下:
var reg = /I like (?=shanghai)/;
var str = 'I like shanghai';
matchReg(reg, str); //測試通過
str = 'I like beijing';
matchReg(reg, str); //不通過
跑下上面的代碼,就馬上理解什么算是正向預查了,如上面的例子,通過(?=pattern)的形式,正則 表達式預測下后面的內容是不是符合要求,如果是那就順利匹配.
相對地,(?!=pattern)的使用意圖正好與(?=pattern)相反,就不復述了
關于貪心和非貪心匹配模式
復制代碼代碼如下:
// 貪心
var reg = //d{1,}/;
var str = '1999';
matchReg(reg, str); // result[0]為1999 能多匹配就多匹配
// 非貪心
reg = //d{1,}?/;
matchReg(reg, str); // result[0]為1 只匹配了一個
從上面的結果很容易看出"貪心"和"非貪心"的含義
pattern?這就表明非貪心匹配模式,一般情況就是貪心的
關于Regexp對象exec函數返回的結果
復制代碼代碼如下:
// 關于返回結果是個什么
// matchReg函數中console.dir(result)能說明問題,firebug中一看便知
關于string的replace函數
function camelize(str) {
return str.replace(/-(/w)/g, function(inputStr, p1) {
console.log(p1);
return p1.toUpperCase();
});
}
console.log(camelize('background-color'));
function uncamelize(str, sep) {
sep = sep || '-';
return str.replace(/([a-z])([A-Z])/g, function(inputStr, p1, p2) {
console.log('p1:%s, p2:%s', p1, p2);
return p1 + sep + p2;
});
}
console.log(uncamelize('backgroundColor', '-'));
上面兩個例子,主要用于說明replace函數的用法,當然還有search,split等函數可以充分利用正則表達式的優勢
關于javascript正則表達式的最佳實踐
就一句話:盡量的精簡,不要復雜,利于讀懂和維護!