【问题标题】:Writing a query parser in javascript用 javascript 编写查询解析器
【发布时间】:2017-02-11 04:38:55
【问题描述】:

我正在尝试编写一个支持以下类型查询子句的解析器

来自:一个人
在:特定公司
location: 人的位置

所以一个示例查询就像 -

from:Alpha at:Procter And Gamble location:US

我如何在 javascript 中编写这个通用解析器。另外,我正在考虑在

之类的查询中包含 AND 运算符
from:Alpha AND at:Procter And Gamble AND location:US

但是,这会与任何字段(宝洁)中的标准值冲突

【问题讨论】:

  • 请包含您目前拥有的代码。
  • 您的语法设计得不是很好。如何期望能够区分作为运算符的 AND 与“Procter and Gamble”中的“and”?
  • @torazaburo 这就是我所处的困境......因为我希望使用布尔 AND 运算符来组合这些子句。我尝试使用“+”进行试验,但它也与我的数据集冲突,例如:c++
  • 我建议引用可能包含空格的值,如"Project and Gamble"

标签: javascript regex parsing


【解决方案1】:

使用像“;”这样的字符而不是 AND 然后调用这些函数:

var query = 'from:Alpha;at:Procter And Gamble;location:US';
var result = query.split(';').map(v => v.split(':'));
console.log(result);

然后你会得到一个对数组,其中 array[0] = prop name 和 array[1] = prop value

var query = 'from:Alpha;at:Procter And Gamble;location:US';
var result = query.split(';').map(v => v.split(':'));
console.log(result);
    

【讨论】:

    【解决方案2】:

    假设您的查询将始终如下所示:at: location:
    你可以这样做:

    const regex = /from:\s*(.*?)\s*at:\s*(.*?)\s*location:\s*(.*)\s*/
    const queryToObj = query => {
      const [,from,at,location] = regex.exec(query)
      return {from,at,location}
    }
    console.log(queryToObj("from:Alpha at Betaat:         Procter And Gamble location:          US"))

    但是,添加终止符可以让您混合顺序并降低一些关键字:

    const regex = /(\w+):\s*(.*?)\s*;/g
    const queryToObj = query => {
      const obj = {}
      let temp
      while(temp = regex.exec(query)){
        let [,key,value] = temp
        obj[key] = value
      }
      return obj
    }
    console.log(queryToObj("from:Alpha at Beta;at:Procter And Gamble;location:US;"))
    console.log(queryToObj("at:Procter And Gamble;location:US;from:Alpha at Beta;"))
    console.log(queryToObj("from:Alpha at Beta;"))

    【讨论】:

      猜你喜欢
      • 2011-08-25
      • 2021-06-07
      • 2019-02-18
      • 2020-10-30
      • 2011-06-25
      • 1970-01-01
      • 2011-08-17
      • 2023-04-05
      • 1970-01-01
      相关资源
      最近更新 更多