2015-07-11 43 views
4

我正在尝试编写一种方法,用于搜索与C#的Linq查询匹配的项目。拆分值但在结果数组中保留值

因此,例如:

myObj.query("name == 'Bob' and age >= 18"); 

因此,采取我认为开始的最好的地方是让每个组,所以首先我对分裂和andor。这似乎给了我一半的想要的东西。

所以我这样做:

Object.prototype.query = function(string){ 
    console.log(string.split(/(?=(and|or))/g)); 
}; 

的问题是,我得到的控制台输出错误:

0: "name == 'Bob' " 
1: "and" 
2: "and age >= 18" 

我期待更多的东西像这样(注2,它不再包含and):

0: "name == 'Bob'" 
1: "and" 
2: "age >= 18" 

我想我在正确的方向前进,我只是不这与正则表达式好,所以我应该怎么做分裂两个值,但保持在输出?

+1

只是一个想法,这是不行的,如果“和”或“或”有其他地方的的字符串中。 “兰迪”作为一个名字会导致字符串与上面的正则表达式分隔错误的地方。 –

+0

真的......也许有比正则表达式更好的方法? –

+0

你可以用'&&'或'||'代替'和'和'或'吗? –

回答

4

这是因为您使用了正向超前修改器。您还需要确保不要抓住部分词语,所以我添加了空格分隔符。 /\s+(and|or)\s+/

"name == 'Bob' and age >= 18 and ornate=='lando'".split(/\s+(and|or)\s+/) 

会的工作,返回

["name == 'Bob'", "and", "age >= 18", "and", "ornate=='lando'"] 

检查“和”内部串变得有点棘手,但与当前的替代品(字符串或数字),这会工作/\s+(and|or)\s+(?![\w\s]*')/

"name == 'Bob' and age >= 18 and ornate='me and lando'".split(/\s+(and|or)\s+(?![\w\s]*')/) 

返回

["name == 'Bob'", "and", "age >= 18", "and", "ornate='me and lando'"] 
+0

工作,但如果引用的是第一个或在中间它不会收到结束撇号 –

+0

我修改过的一个根本不工作,所以我删除它。我会让其他人把它作为你的更新请求。或者只是把它作为一个新的问题,因为这是一个新的要求,你的原始问题已被回答。 – Jan

+0

好的。我会保持现在的简单直到我得到我想要的工作。 –

2

尝试用这种

Object.prototype.query = function(string){ 
    console.log(string.split(/\s+(and|or)\s+/g)); 
}; 

var myObj = {}; 
myObj.query("name == 'Bob' and age >= 18"); 

主要生产

[ 'name == \'Bob\'', 'and', 'age >= 18' ] 
+0

如果查询查询看起来像这样:'companyName =='Bob and Joe'' –

+0

@Jan这将工作 –

+0

@GetOffMyLawn不知道为什么Jan删除console.log(string.split(/ ['\ d] + \ s + (和|或)\ S + /)); - 它似乎工作。可能需要['\ d]仅在正则表达式 –