我认为正则表达式在这里不会对您有太大帮助。他们可能能够进行一些非常简单的匹配,但是您在这里真正看到的是语法解析问题。您可能想阅读旨在表达抽象语法的语言,例如扩展巴科斯-瑙尔形式(EBNF)。这听起来很吓人,但实际上并不难掌握。一旦你能够用一种正式的语言来描述你的语法,解析它就会变得容易得多(至少,你有一个关于什么样的输入是有效的规范)。例如,您的问题可能有以下 EBNF:
expression = "every" time-unit|time-unit-list|composite-time-unit
time-unit = { ordinal } "day" | "weekday"
ordinal = "first" | "second" | "third" | ...
等等。这不是一项微不足道的工作;解析一个英语句子,即使是这样一个相当严格的句子也可能涉及很多。然而,这是一种成熟而严格的方法。
一旦你定义了你的语法,你就可以为它构建一个解析器。这是寻找终端(如“每个”)然后将它们与规则匹配的问题。例如,您可能有如下内容(伪代码):
words = split(/\s*/,lowercase(input))
if( words[0] == "every" ) {
switch( words[1] ) {
case "first":
case "second":
case "third":
...
parseTimeUnit(words);
break;
case "day":
everyDay = true;
break;
...
}
}
根据语法的复杂性,您可能会考虑使用Yacc之类的东西自动生成解析器。
您已经解决了一大堆问题,但解决问题是有益的,祝您好运!
更新:我只建议使用 Yacc,因为它是我所知道的最古老的解析器生成器之一。但是,其中有一百万个,其中很多会为您发出 Javascript。您可以查看Wikipedia 对解析器生成器的比较了解更多信息。