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

In JavaScript, how do I split a string based on conditions within that string?

本文关键字:字符串 拆分 条件 何根 JavaScript      更新时间:2023-09-26

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 中编写解析器的看法。