较大的正则表达式Javascript用于日期和时间接近关键字,部分用于缺少第一位数字的天数

较大的正则表达式Javascript用于日期和时间接近关键字,部分用于缺少第一位数字的天数,javascript,regex,Javascript,Regex,这是我的正则表达式: [代码>(奥迪亚·诺迪亚·塞萨萨萨萨萨萨萨萨萨萨萨虚拟(奥迪亚·奥迪亚·奥迪亚·萨萨萨萨萨萨萨萨萨萨萨萨萨萨萨萨萨萨萨萨萨虚拟虚拟虚拟虚拟(até)目前,(?:::(((!奥迪亚·奥迪亚·奥迪亚·萨萨萨萨萨萨萨萨萨萨虚拟虚拟虚拟(现场)在场在场在场在场))))*([1-3[1-2-2-1-2[1-1-2][[1-1-2[3[0-2[0-2[0-2[0-0-0-2[0-0-0-0-0-0-0-0-0-0-9]5 5 5 5 5 5 5 5 5 5 5 5 5]((0-3[0-

这是我的正则表达式:

[代码><代码>(奥迪亚·诺迪亚·塞萨萨萨萨萨萨萨萨萨萨萨虚拟(奥迪亚·奥迪亚·奥迪亚·萨萨萨萨萨萨萨萨萨萨萨萨萨萨萨萨萨萨萨萨萨虚拟虚拟虚拟虚拟(até)目前,(?:::(((!奥迪亚·奥迪亚·奥迪亚·萨萨萨萨萨萨萨萨萨萨虚拟虚拟虚拟(现场)在场在场在场在场))))*([1-3[1-2-2-1-2[1-1-2][[1-1-2[3[0-2[0-2[0-2[0-0-0-2[0-0-0-0-0-0-0-0-0-0-9]5 5 5 5 5 5 5 5 5 5 5 5 5]((0-3[0-3[0-3[0-3[0-3[0-0-0-3[0-0-9]*horas*\s*e\s*\s*horas*\s*)([0-5]?[0-9])?

它应该选择如下内容:

2022年7月24日下午16:00

并提取
“2022年7月24日16:00小时”

由于某种原因,它只使用了
“2022年7月4日16:00小时”
缺少第一个数字

问题是,
“9 de Janeiro de 2021”
(没有前导零或任何其他数字)也是一个可能的输入和答案

几天前我问了这个问题,得到的答案是我的正则表达式的日期位的逻辑是有效的(但只有当从更大的表达式中取出时),
([1-2][0-9]|3[0-1]|0?[1-9])
,我尝试了改变位置、不同的组合,以使零固定并添加另一个或
([1-2][0-9]| 3[0-1]| 0[1-9]|[1-9])
,它们都不起作用

那么它为什么要“吃”第一天的数字,当它在里面充分表达的时候呢

正如regex101.com上所说,它的一个演示正在运行,配置设置为ECMAScript(JavaScript),全局多行,不区分大小写

当他们问我这是在哪里使用的时候,这个位regex是从一个工作流中获取的,这个工作流有一个文本解析器“模块”,它接受带有这些配置的regex,我只能给它一个regex,不允许使用不同的编程语言

请参见。

您可以添加一个空格:

(audiência|sessão virtual)(?:(?!audiência|sessão virtual|até).)* ([1-2][0-9]|3[0-1]|0?[1-9])\s*de\s*([^\s]+)\s*de\s*((19|20)?\d\d)(?:,|\s*)*(?:,|\s*)*\S*(?:,|\s*)*([01]?[0-9]|2[0-3])(h|:|\s*horas*\s*e\s*|\s*horas*\s*)([0-5]?[0-9])?
你的正则表达式的问题是
2
(audi|ncia|sessão virtual)的一部分(?:(?!audi|ncia|sess|o virtual|até))*
([1-2][0-9]| 3[0-1]|[1-9])
允许一位数字

问号也有用

(audiência|sessão virtual)(?:(?!audiência|sessão virtual|até).)*?([1-2][0-9]|3[0-1]|0?[1-9])\s*de\s*(\S+)\s*de\s*((19|20)?\d\d)(?:,|\s*)*(?:,|\s*)*\S*(?:,|\s*)*([01]?[0-9]|2[0-3])(h|:|\s*horas*\s*e\s*|\s*horas*\s*)([0-5]?[0-9])?

(?:(?!奥迪|赛斯|奥虚拟| até))*
是贪婪的。它需要尽可能多的时间,包括
2
<代码>(?:(?!奥迪|赛斯|o virtual | até))*?是懒惰的。它需要尽可能少的时间。

您想要实现什么?如果您查看第2组的regex101演示,输出结果仅为4,而不是24。我试图从一个可以包含其他日期的较大文本中获取与“奥迪尼亚”一词非常接近的具体日期。最接近单词“audiência”的一个用于安排活动和会议。首先获取整个匹配字符串,然后进行相应拆分。我也不太需要将日期验证为日期(我知道这是regex的一个大问题),它有一个接近“时间”和接近“关键字”就足以将其验证为日期,即使是像2099年2月31日这样一个奇怪的日期,它仍然是一个有效的输出。空间就像一个符咒,对懒散搜索的编辑起作用tonote
(?:,|\s*)*(?:,|\s*)*\s*(?:,|\s*)
总有一天会造成灾难性的回溯。此外,在标记中,始终在先行标记后使用点。