javascript - 用于设计查询语言的正则表达式

标签 javascript regex

最近我们的团队想建立我们自己的查询语言,但是我们有一个关于正则表达式的问题

如果我们下面有一个查询

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

关键是我们想知道是否可以定义一个“单一”正则表达式来匹配这个查询并捕获 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;

如有任何建议,我们将不胜感激。

最佳答案

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

我建议你使用PEG : 解析器生成器。 您将以类似于 BNF 的方式定义您的语言,然后它会为您生成一个解析器。

这是一个非常可靠的工具,比正则表达式强大得多,而且也非常容易使用,尤其是对于像您这样的简单 DSL。

关于javascript - 用于设计查询语言的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21957619/

相关文章:

javascript - 将html文本适当 chop 到固定大小的区域

r - 在字符串中用 $ grep

regex - Invision电源板中修改的YouTube链接所需的媒体标签正则表达式代码

python - 如何使用python在匹配中匹配具有相同模式的多个实例

javascript - 运行 'if url contains' 条件函数而不刷新页面

javascript - Parsley.js 和 Laravel 表单验证错误

Javascript 价格计算器问题(复选框)

javascript - 如何查找和更新对象数组中的值?

javascript - 如何从电子邮件 ID 数组中提取名称数组

javascript - 正则表达式在 AngularJS 中不起作用