在 JavaScript 中,如何根据字符串中的条件拆分字符串
In JavaScript, how do I split a string based on conditions within that string?
Background
我目前正在编写一个需要接受命令作为字符串的函数。 字符串需要拆分为更精细的部分,以便函数可以使用这些部分。 下面是一个示例字符串:
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 中查询数据的框架,虽然我很欣赏所有提示和建议,但我仍然希望得到这个问题的答案,无论还有什么可用的。
正则表达式,特别是 JavaScript 的正则表达式风格,它缺乏递归和平衡组,无法完成像这样解析代码的任务。您的示例代码及其格式良好的嵌套括号是上下文无关语法的典型示例,比我更聪明的人宣布用正则表达式无法实现。
你需要的是一个实际的解析器。有完整的JavaScript解析器,它们本身就是用JavaScript实现的(JSLint有一个)。或者,如果您只想允许某些类型的表达式,则可以生成适合您选择的任何语法的分析器。
需要注意的一件事:这绝对是可以使用解析器实现的(尽管不能单独使用正则表达式)。但这不太可能是容易或简单的。如果这是针对实际项目,除非您有驱动理由编写自己的标记/编程语言,否则我建议您考虑使用现有解决方案。如果您描述的是表达式而不是命令式代码(例如 LINQ 与经典 C#),XML 或 JSON 可能是很好的方法。
合理解析它的唯一方法是使用(等待它...)解析器!
请参阅 http://javascript.crockford.com/tdop/tdop.html Douglas Crockford 对如何在 Javascript 中编写解析器的看法。
- 将字符串拆分为数组时出现JavaScript错误
- 如何将字符串拆分为字符,但在javascript中保留空格
- 将字符串拆分为;只要它's不在»«
- 如何将以下字符串拆分为二维数组:
- 将javascript中的字符串拆分为一个数组
- 这个字符串拆分器可以重构或改进吗
- Regex将字符串拆分为大小适中的块
- 将字符串拆分为具有固定字符数的数组
- 将字符串拆分为数组
- 如何在没有javascript中的split函数的情况下将字符串拆分为单词
- 字符串拆分并获取第一次和最后一次出现
- node.js将接收到的字符串拆分为不同的变量,然后格式化为json字符串
- 如何将复杂的字符串拆分为多个部分
- 将字符串拆分为多维数组
- 将逗号分隔的字符串拆分为单独的字符串
- 如何在 Javascript 中以特定间隔将字符串拆分为数组
- Javascript 字符串拆分
- 使用 jQuery 将长字符串拆分为文本块
- 在javascript中将字符串拆分为句子
- 在将字符串拆分为硒时获取空输出