Javascript正则表达式搜索日历事件
我有一种情况,我需要选择一个句子并选中某些框和/或在文本输入中输入数字 盒子是这样的Javascript正则表达式搜索日历事件,javascript,regex,Javascript,Regex,我有一种情况,我需要选择一个句子并选中某些框和/或在文本输入中输入数字 盒子是这样的 每天 每周 每月 因此,我不确定使用不同的regex对象来搜索不同的情况是否更好,或者我是否应该尝试创建一个大的regex对象,然后切换/设置结果的大小写 以下是字符串可以是什么的一些示例: 每天 每个工作日 每周星期日、星期一、星期三 每3周在星期日、星期五 每个月的第一个星期日 每2个月的第1天 每年一月一日 说到正则表达式,我可以做得很好,但这是不合适的,我不确定我是否应该使用不同的正则表达式对象
- 每天
- 每周
- 每月
- 每天
- 每个工作日
- 每周星期日、星期一、星期三
- 每3周在星期日、星期五
- 每个月的第一个星期日
- 每2个月的第1天
- 每年一月一日
它看起来像是/\w+\s(\d+)?\s(\w+)/负责“每周”、“每天”、“每月”、“每年”、“每10天”等工作。这似乎是您试图对某些数据结构所做的,我相信这不是regex的工作(尽管它可能是解决方案的一部分).我认为正则表达式在这里帮不了你多少忙。它们可能能够进行一些非常简单的匹配,但您在这里真正看到的是语法解析问题。您可能需要阅读设计用于表示抽象语法的语言,如(EBNF)。这听起来很吓人,但其实并不难理解。一旦你能够用一种正式的语言描述你的语法,解析它就变得容易多了(至少,你有一个关于什么样的输入是有效的的规范)。例如,您的问题可能有以下EBNF:
expression = "every" time-unit|time-unit-list|composite-time-unit
time-unit = { ordinal } "day" | "weekday"
ordinal = "first" | "second" | "third" | ...
等等。这不是一件小事;解析一个英语句子,即使是这样一个限制性很强的句子,也会涉及到很多问题。然而,这是一种行之有效的严格方法
一旦定义了语法,就可以为它构建解析器。这是一个查找终端(如“every”)然后将其与规则匹配的问题。例如,您可能有如下内容(伪代码):
根据语法的复杂程度,您可能会考虑使用以下内容自动生成解析器
你已经解决了一大堆问题,但这是一个值得解决的问题,祝你好运
更新:我只建议使用Yacc,因为它是我所知道的最古老的解析器生成器之一。然而,它们有一百万个,其中很多将为您发出Javascript。您可以查看更多信息。那么……到目前为止,代码在哪里?没有完整的答案,所以我将其作为注释。我认为您应该只对您期望的字符串进行非常具体的检查。这将更加清晰,并且需要保持。不过,请先编写完整的代码,您将很快遇到问题,以便您自己理解最佳解决方案。您最好创建自己的解析器:。
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;
...
}
}