2017-01-30 116 views
1

我建立一個小型的搜索引擎我的網站上可以搜索詞並具有過濾器陣列。通過分析字符串創建子

我需要能夠採取的長字符串,並把它分解成更小的子字符串數組。單詞(沒有過濾器)應該放在一個字符串中,然後每個過濾器應該放在一個單獨的字符串中。單詞和過濾器的順序應該不重要。

例如:

如果我的字符串是:

「前招呼:17年1月1日之後:2015年1月1日」

OR:

「before:01/01/17 hello after:01/01/2015」

我希望我的函數返回(以任意順序):

[ 「你好」, 「前:2017年1月1日」, 「後:2015年1月1日」]

+0

我想通了,如何解決這個字的時候是之前的任何過濾器,但我無法分割了繩子,如果這個詞是在字符串 –

回答

1

您可以使用空格和分裂積極的前瞻。

console.log("hello before: 01/01/17 after: 01/01/2015".split(/\s*(?=before|after)/));

+0

由於龔如心的中間/結束。你的解決方案原本很好,但現在我試圖解決問題的順序無關緊要。 –

+0

你可以省略'後的空間:'然後通過空間分割,然後檢查零件的類型。 –

0

是否有代碼大小的任何具體限制嗎?我的意思是,這不是代碼高爾夫或其他任何東西,那麼爲什麼不直接以簡單的方式來做呢?

首先,你可以用一個簡單的正則表達式記號化這個

var search_string = "hello before: 01/01/17 after: 01/01/2015"; 
var regex = /(?:(before|after)\:\s*)?([^ ]*)/g 
var token = null; 
while ((token = regex.exec(search_string)) != null) { 

然後,你可以把他們安排到你想要的任何數據結構。例如,我們可以把過濾器到一個單獨的對象,像這樣:

var filters = {}; 
var words = []; 
//... 
    if (token[1]) 
     filters[token[1]] = token[2]; 
    else 
     words.push(token[2]); 

之後,你可以操縱這些結構你想

words.sort(); 
if (filters['before']) words.push(filters['before']); 
if (filters['after']) words.push(filters['after']); 
return words; 

任何辦法,我不知道爲什麼你」我希望這樣安排,但這會使事情變得統一。或者,你可以在一個更直接的方式使用它們:

var before = Date.parse(filters['before'] || '') || false; 
if (before !== false) before = new Date(before); 
var after = Date.parse(filters['after'] || '') || false; 
if (after !== false) before = new Date(before); 
function isDocumentMatchSearch(doc) { 
    if (before !== false && doc.date > before) return false; 
    if (after !== false && doc.date < after) return false; 
    for (var i = 0; i < words.length; i++) { 
     if (doc.title.indexOf(words[i]) < 0 &&doc.text.indexOf(words[i]) < 0) return false; 
    } 
    return true; 
} 

因爲你沒給很多的信息,你通過搜索什麼,它的存儲,等等等等的數據類型和存儲類型,這是我能提供的最好的。