我目前正在编写一个需要接受命令作为字符串的函数。字符串需要拆分为更精细的部分,以便函数可以使用这些部分。这是一个示例字符串:
People.filter(Hometown.eq("Pittsburgh"))
其中,在此简化示例中,我需要解析为:
var objectToTraverse = "People";
var actionToTake = "filter";
var comparer = "Hometown";
var targetValue = "Pittsburgh";
对于上面的示例,拆分操作非常简单:
var _command = "People.filter(Hometown.eq("Pittsburgh"))";
var command = _command.split(".");
var objectToTraverse = command[0];
var actionToTake = command[1].split("(")[0];
var comparer = command[1].split("(")[1];
var targetValue = command[2].split("(")[1].split(")")[0];
但是如果你有一个更复杂的命令如下:
People.filter(Hometown.eq("Pittsburgh") && Gender.eq("male") || Age.eq(>= 35)).orderBy(Age,Gender).limitResultSet(10)
每次模式可能不同。
使用JavaScript,如何根据各种混合分隔符和条件有效地解析字符串命令:
People.filter(Hometown.eq("Pittsburgh") && Gender.eq("male") || Age.eq(>= 35)).orderBy(Age,Gender).limitResultSet(10)
我知道可用于在JavaScript中查询数据的所有框架,虽然我很感谢所有提示和建议,但我仍然希望得到这个问题的答案,无论其他内容是什么。
答案 0 :(得分:1)
理智地解析这个的唯一方法是(等待它......)一个解析器!
有关Douglas Crockford关于如何在Javascript中编写解析器的看法,请参阅http://javascript.crockford.com/tdop/tdop.html。
答案 1 :(得分:1)
正则表达式,特别是JavaScript缺乏递归和平衡组的正则表达式的风格,不能完成解析这样的代码的任务。您的示例代码及其格式良好的嵌套括号是context-free grammar的典型示例,far wiser men than I已声明可以使用正则表达式进行撤消。
您需要的是一个真正的解析器。有full JavaScript parsers可用,它们本身是用JavaScript实现的(JSLint中有一个)。或者,如果您只想允许某些类型的表达式,则可以generate a parser to suit any grammar you choose。
要注意的一件事:这对于解析器来说绝对可行(尽管不是单独使用正则表达式)。但它不太容易或简单。如果这是一个真实世界的项目,除非你有编写自己的标记/编程语言的驱动理由,我建议你考虑使用现有的解决方案。如果您正在描述表达式而不是命令式代码(例如LINQ与经典C#),那么XML或JSON可能是很好的方法。