我正在尝试根据以下规则拆分字符串。
test1 test2 test3 => [test1, test2, test3]
test1 test2:a b test3:c d => [test1, test2:a b, test3:c d]
test1 test2:"a b" test3:c d => [test1, test2:"a b", test3:c d]
我可以抛出更多的例子,但基本上,每个空格分隔的单词应该是结果列表中的自己的条目,除非该单词出现在冒号后面。此时,间隔词应被视为前一个词的一部分,直到半冒号前面的下一个词。
我这样做是为了创建我自己的小搜索引擎的初始阶段,我需要一种方法来解析用户提供的输入。我试图避免强迫用户做这样的事情
test1 test2:(a, b) test3:(c, d)
虽然我觉得如果它在美学上更令人愉悦,那就好了。
我确信这可以通过javascript正则表达式来完成,但我老实说对他们很可怕,并且无法解决他们如何工作一半的时间。
有人可以给我建议如何以这种方式分割我的字符串,正确的正则表达式或其他更好的方法吗?
谢谢!
编辑:
我已经有一些代码可以进行一些解析而不是使用正则表达式,但它已经变得越来越复杂了。这个问题主要是看看regexp是否是一种更好的方法。
edit2:
完全放弃reg-exp方法。萨尔曼A提出了一个非常简洁的方法,可以做我想要的,打败我之前的代码。
答案 0 :(得分:4)
我知道我应该解析它:
function parseQuery(query) {
var tokens = query.split(/\s+/), i = 0, prev, curr;
while (i < tokens.length - 1) {
curr = tokens[i];
next = tokens[i + 1];
if (curr.indexOf(":") >= 0 && next.indexOf(":") < 0) {
tokens.splice(i, 2, curr + " " + next);
} else {
i++;
}
}
return tokens;
}
var tests = [
'test1',
'test1 test2',
'test1 test2 test3',
'test1 test2:a b test3:c d',
'test1 test2:a b test3:c d e',
'test1 test2:a b test3:c d e test4:f',
], i;
for (i = 0; i < tests.length; i++) {
console.log(tests[i], parseQuery(tests[i]));
}
<!-- results pane console output; see http://meta.stackexchange.com/a/242491 -->
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>