2017-01-30 65 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; 
} 

因为你没给很多的信息,你通过搜索什么,它的存储,等等等等的数据类型和存储类型,这是我能提供的最好的。