首頁  >  文章  >  web前端  >  JS正規表示式之非捕獲分組用法實例分析

JS正規表示式之非捕獲分組用法實例分析

高洛峰
高洛峰原創
2017-01-09 15:48:131353瀏覽

本文實例講述了JS正規表示式非捕獲分組用法。分享給大家供大家參考,具體如下:

最近在看JsonSQL的時候,透過原始碼中的一段正規表示式,了解到了什麼是非捕獲分組以及它的使用場景。在js中,正常的擷取分組格式為(XX),非擷取分組格式為(?:XX)。我們先從正規表示式數量詞說起,如果我們要求字元b至少出現一次,可以使用正規/b+/;如果要求ab至少出現一次,那麼必需使用/(ab)+/,不能用/ab+/。也就是說,如果想對多個字元使用數量詞,必需要用圓括號。

var str = "a1***ab1cd2***c2";
var reg1 = /((ab)+\d+)((cd)+\d+)/i;
var reg2 = /((?:ab)+\d+)((?:cd)+\d+)/i;
alert(str.match(reg1));//ab1cd2,ab1,ab,cd2,cd
alert(str.match(reg2));//ab1cd2,ab1,cd2

   

可以看出捕獲分組和非捕獲分組的區別了吧:非捕獲分組,只是用來匹配,並不會提取分組內容。也就是說,如果我們只想用圓括號將一些字元用數量詞修飾,並不需要這個分組的內容,那就是非捕獲分組。

下面這段程式碼用來提取sql語句中的各個子片段,大量使用了非捕獲分組,可以細細品味下。

var returnfields = sql.match(/^\s*SELECT\s+((?:[0-9A-Za-z_]+\s*,\s*)+[0-9A-Za-z_]+ |\*|[0-9A-Za-z_]+)\s+FROM\s+([a-z0-9A-Z_]+)(?: where\s+(.+))?(?:\s+order\s+by\s+([a-z0-9_A-Z]+)(?:\s+(asc|desc|ascnum|descnum)?))?(?:\s+limit\s+(\d+,\d+))?/i);
var ops = {
  fields: returnfields[1].replace('\s','').split(','),
  from: returnfields[2].replace('\s',''),
  where: (returnfields[3] == undefined)? "true":returnfields[3],
  orderby: (returnfields[4] == undefined)? []:returnfields[4].replace('\s','').split(','),
  order: (returnfields[5] == undefined)? "asc":returnfields[5],
  limit: (returnfields[6] == undefined)? []:returnfields[6].replace('\s','').split(',')
};

   

關於這段正規有幾個地方解釋下:

1.字段名稱和表明只能由大小寫字母、數字和底線組成。

2.where後面的條件必須放在()中,否則不能匹配。這個和真正的SQL是不同的。

3.select後面的欄位有3種格式:單一欄位、多個欄位(以逗號分隔)、所有欄位(以*表示)。

4.where子語句、order by子語句、limit子語句都是可選的。

如下面這段文本,能夠匹配上面的正則:

select age from data where (name=='aty')

希望本文所述對大家JavaScript程式設計有所幫助。

更多JS正規表示式之非捕獲分組用法實例分析相關文章請關注PHP中文網!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn