在JavaScript中,如何根据该字符串中的条件拆分字符串?

时间:2012-04-17 17:54:39

标签: javascript regex string

背景

我目前正在编写一个需要接受命令作为字符串的函数。字符串需要拆分为更精细的部分,以便函数可以使用这些部分。这是一个示例字符串:

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中查询数据的所有框架,虽然我很感谢所有提示和建议,但我仍然希望得到这个问题的答案,无论其他内容是什么。

2 个答案:

答案 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可能是很好的方法。