Javascript正则表达式搜索日历事件

时间:2012-08-28 00:40:35

标签: javascript regex

我的情况是我需要判断句子并检查某些方框和/或在文本输入中输入数字。

这些盒子就像..

  • 每天
  • 一周
  • 每个月

所以我不确定使用不同的正则表达式对象来搜索不同的情况,或者我是否应该尝试制作一个大的正则表达式对象,然后切换/结果化结果。

以下是字符串的一些示例:

  • 每天
  • 每个工作日
  • 每周星期一,星期一,星期三
  • 星期天,星期五每3个星期
  • 每个月的第一个星期天
  • 每2个月第1天
  • 每个1月1日

当谈到正则表达式时,我可以做得很好,但这不属于联盟,我不确定是否应该使用不同的正则表达式对象或尝试制作一个大的对象。谢谢你的帮助

看起来像/ \ w + \ s?(\ d +?)?\ s(\ w +)/照顾“每周”,“每一天”,“每个月”,“每年”,“每一个10天“,等等。

2 个答案:

答案 0 :(得分:3)

我不认为正则表达式会对你有所帮助。他们可能能够做一些非常简单的匹配,但你真正看到的是语法解析问题。您可能希望阅读用于表达抽象语法的语言,例如Extended Backus-Naur Form(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's comparison of parser generators以获取更多信息。

答案 1 :(得分:0)

您似乎正在尝试is parse a string进入某些数据结构,并且我认为这不是正则表达式的工作(尽管它可能是解决方案的一部分)。