Javascript 用于设计查询语言的Regexp

Javascript 用于设计查询语言的Regexp,javascript,regex,Javascript,Regex,最近,我们的团队想要建立自己的查询语言,但我们在regexp方面遇到了一个问题 如果我们有下面的问题 select A where B skip C limit D 关键字“where”、“skip”和“limit”可以有1或0,这意味着我们也可以有类似的查询 select A where B skip C select A skip C limit D select A limit D 关键是我们想知道是否有可能定义一个“单一”的regexp来匹配这个查询并捕获a、B、C和D 下面是我们目

最近,我们的团队想要建立自己的查询语言,但我们在regexp方面遇到了一个问题

如果我们有下面的问题

select A where B skip C limit D
关键字“where”、“skip”和“limit”可以有1或0,这意味着我们也可以有类似的查询

select A where B skip C
select A skip C limit D
select A limit D
关键是我们想知道是否有可能定义一个“单一”的regexp来匹配这个查询并捕获a、B、C和D

下面是我们目前的做法

dql_parser.parse = function(str) {
var reg_arr = []
if(str.toLowerCase().indexOf('select') !== -1) {
    var reg = new RegExp(/select\s+(.*?)(limit|where|skip)/i)
    var exe = reg.exec(str)
    if(exe !== null) {
        reg_arr.push('fields=' + exe[1])
    }else {
        var reg = new RegExp(/select\s+(.*)?/i)
        var exe = reg.exec(str)
        reg_arr.push('fields=' + exe[1])
    }
}



if(str.toLowerCase().indexOf('where') !== -1) {
    var reg = new RegExp(/where\s+(.*?)(select|limit|skip)/i)
    var exe = reg.exec(str)
    if(exe !== null) {
        reg_arr.push('selector=' + exe[1])
    }else {
        var reg = new RegExp(/where\s+(.*)?/i)
        var exe = reg.exec(str)
        reg_arr.push('selector=' + exe[1])
    }
}

if(str.toLowerCase().indexOf('skip') !== -1) {
    var reg = new RegExp(/skip\s+(.*?)(select|limit|where)/i)
    var exe = reg.exec(str)
    if(exe !== null) {
        reg_arr.push('skip=' + exe[1])
    }else {
        var reg = new RegExp(/skip\s+(.*)?/i)
        var exe = reg.exec(str)
        reg_arr.push('skip=' + exe[1])
    }
}

if(str.toLowerCase().indexOf('limit') !== -1){
    var reg = new RegExp(/limit\s+(.*?)(select|where|skip)/i)
    var exe = reg.exec(str)
    if(exe !== null) {
        reg_arr.push('limit=' + exe[1])
    }else {
        var reg = new RegExp(/limit\s+(.*)?/i)
        var exe = reg.exec(str)
        reg_arr.push('limit=' + exe[1])
    }

}

return reg_arr;
}


感谢您的建议。

这不是对您问题的直接回答,但可能会有所帮助

我建议您使用:解析器生成器。 您将用类似于BNF的东西定义您的语言,然后它将为您生成一个解析器


这是一个非常可靠的工具,比regexp功能强大得多,而且也非常容易使用,特别是对于像您这样的简单DSL。

这不是对您的问题的直接回答,但可能会有所帮助

我建议您使用:解析器生成器。 您将用类似于BNF的东西定义您的语言,然后它将为您生成一个解析器


这是一个非常可靠的工具,比regexp功能强大得多,而且也非常容易使用,特别是对于像您这样的简单DSL。

长答案短:

你想“设计你自己的查询语言”并决定用正则表达式解析它

编写一个“真正的”解析器是唯一的方法,如果你不能接受挑战,也许你应该放弃这个想法

如果你真的想这么做,那就从学习开始(Lex/Yacc,我真的不知道他们怎么称呼他们了)。这才是真正的交易(至少这是我喜欢的……工作工具包,如果你“投资”它,从长远来看肯定会有回报。)


祝你好运

长答案短:

你想“设计你自己的查询语言”并决定用正则表达式解析它

编写一个“真正的”解析器是唯一的方法,如果你不能接受挑战,也许你应该放弃这个想法

如果你真的想这么做,那就从学习开始(Lex/Yacc,我真的不知道他们怎么称呼他们了)。这才是真正的交易(至少这是我喜欢的……工作工具包,如果你“投资”它,从长远来看肯定会有回报。)


祝你好运

但是如果你真的,真的想在你的生活中遭受这样的痛苦:

(select\s+(\w*))\s+(where\s+(\w*))?\s*(skip\s+(\w*))?\s*(limit\s+(\w*))?
我会给你A、B、C和D。
祝你好运

但是如果你真的,真的想在你的生活中遭受这样的痛苦:

(select\s+(\w*))\s+(where\s+(\w*))?\s*(skip\s+(\w*))?\s*(limit\s+(\w*))?
我会给你A、B、C和D。
祝你好运

所以,让我来弄清楚,你想用Javascript编写解析器吗?你是否如此憎恨自己以至于想要忍受这种痛苦?许多人认为正则表达式比显式解析更难读懂。你确定要缩短你的代码吗?那么让我把这个弄清楚,你想用Javascript写一个解析器吗?你是否如此憎恨自己以至于想要忍受这种痛苦?许多人认为正则表达式比显式解析更难读懂。你确定要缩短你的代码吗?别误会我:如果你再进一步,仅仅解析这种简单的行,我就可以使用regexp。但是我同意另一个观点,用regexp“设计你自己的语言”绝对是个坏主意。在这种情况下,我也会同意。别误会我的意思:如果你进一步分析这种简单的行,regexp对我来说没问题。但是我同意另一个观点,用regexp“设计你自己的语言”绝对是个坏主意。在这种情况下,我也会同意。