Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式搜索日历事件_Javascript_Regex - Fatal编程技术网

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

Javascript正则表达式搜索日历事件,javascript,regex,Javascript,Regex,我有一种情况,我需要选择一个句子并选中某些框和/或在文本输入中输入数字 盒子是这样的 每天 每周 每月 因此,我不确定使用不同的regex对象来搜索不同的情况是否更好,或者我是否应该尝试创建一个大的regex对象,然后切换/设置结果的大小写 以下是字符串可以是什么的一些示例: 每天 每个工作日 每周星期日、星期一、星期三 每3周在星期日、星期五 每个月的第一个星期日 每2个月的第1天 每年一月一日 说到正则表达式,我可以做得很好,但这是不合适的,我不确定我是否应该使用不同的正则表达式对象

我有一种情况,我需要选择一个句子并选中某些框和/或在文本输入中输入数字

盒子是这样的

  • 每天
  • 每周
  • 每月
因此,我不确定使用不同的regex对象来搜索不同的情况是否更好,或者我是否应该尝试创建一个大的regex对象,然后切换/设置结果的大小写

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

  • 每天
  • 每个工作日
  • 每周星期日、星期一、星期三
  • 每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; 
    ...
  }
}