最近我们的团队想建立我们自己的查询语言,但是我们有一个关于正则表达式的问题
如果我们下面有一个查询
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/