解析字符串以创建子串数组

时间:2017-01-30 18:34:02

标签: javascript arrays string

我正在我的网站上构建一个可以搜索单词并有过滤器的迷你搜索引擎。

我需要能够获取一个长字符串,并将其拆分为一个较小的子字符串数组。单词(没有过滤器)应该放在一个字符串中,然后每个过滤器应该放在一个单独的字符串中。单词和过滤器的顺序无关紧要。

例如:

如果我的字符串是:

  

“你好之前:01/01/17之后:01/01/2015”

OR:

  

“之前:01/01/17你好之后:01/01/2015”

我希望我的函数能够以任何顺序返回:

  

[“你好”,“之前:01/01/2017”,“之后:01/01/2015”]

2 个答案:

答案 0 :(得分:1)

你可以使用空格和积极的前瞻来分裂。



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




答案 1 :(得分: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;
}

由于您没有提供有关您正在搜索的内容,存储的数据类型或存储类型等的大量信息,这是我能提供的最佳信息。