2014-04-18 29 views
1

所以我只是好奇,如果有一種方法來鏈正則表達式。只是想優化我的代碼。我想找到一個表達式,然後從結果中找到另一個表達式。鏈接jQuery Regexp匹配可能嗎?

工作編碼:

match = $('body').html().match(/(\[~\{ .*? \}~\])/g); 
console.log(match[0]); 

findText = match[0].match(/\w+/); 
console.log(findText); 

我已經試過:

match = $('body').html().match(/(\[~\{ .*? \}~\])(\w+)/g); 
console.log(match[0]); 

產生式(1)的誤差

match = $('body').html().match(/(\[~\{ .*? \}~\])|(\w+)/g); 
console.log(match[0]); 

實測值表達式1和然後找到表達式2外。

我的HTML:

[~{ header }~] 

<p>This is the home page</p> 

[~{ footer }~] 
+0

你想寫一個正則表達式實際上選擇你在找什麼,而不是鏈在一起的兩個諧音。 '.match()'是一個JavaScript字符串函數,而不是一個jquery函數,所以ti返回一個結果數組(或者如果沒有匹配,則返回null),這使得鏈接(帶有錯誤控制)變得困難。你究竟想在這裏取得什麼成就? – Adam

+0

在正文中找到[〜{anything}〜],然後從中找到任何東西。 – jemiloii

+0

工作代碼部分正是我想要的,只是看我是否可以優化它。 – jemiloii

回答

2

我只是用一個捕獲組爲[~{ ... }~]結構內部的字。

\[~\{ (\w+) \}~\] 

唯一的區別是我匹配(\w+)而不是.*?。我還刪除了圍繞整個表達式的捕獲組((...)),因爲它不是必需的。

Regex101


現在是有點難以訪問在Javascript多個捕獲組,但我用一些示例代碼this answer(感謝馬蒂亞斯Bynens):

function getMatches(string, regex) { 
    var matches = []; 
    var match; 
    while (match = regex.exec(string)) { 
     matches.push(match); 
    } 
    return matches; 
} 

var myString = $('body').html(); 
var myRegEx = /\[~\{ (\w+) \}~\]/g; 

var matches = getMatches(myString, myRegEx); 
console.log(matches[0]); 

輸出:

Array[2] 
    0: "[~{ header }~]" // The whole match 
    1: "header"   // The captured group 


因此,最終的代碼可能看起來是這樣的(這是僞代碼):

matches; // this is set from previous code block 

for(var i = 0; i < matches.length; i++) { 
    var needsToBeReplaced = matches[i][0]; 
    var template = getTemplate(matches[i][1]); 
} 
+0

感謝您的回覆,但是這只是返回[〜{header}〜] vs剛剛回復標題 – jemiloii

+0

@JemiloII看到我的最終更新。這將是一系列的比賽。每個匹配將是一個數組,其中包含0-索引處的整個匹配('[〜{header}〜]')和1索引處的捕獲組('header')。 – Sam

+1

哇,這種方式真的很好!我喜歡多維數組格式。此格式將使以後用更新的內容更容易地替換代碼變得更容易。 對於jsfiddle,如果添加https://getfirebug.com/firebug-lite-debug.js作爲外部資源,則會得到一個調試器。 HTTP://的jsfiddle。net/cqTAv/1/ – jemiloii