0

这是我在 SO 上的第一篇文章,所以提前感谢大家;这对我非常有帮助,我很高兴有一天我可以从新手变成在这里回答一些问题!但在那之前:

/(?=((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]{0,6})\s)(\d){1,2}/

10 people will be attending the Board of Directors meeting on August 6th

在上面的 RegEx 中,我试图在 8 月 6 日仅匹配“6”,并故意用字符串中的另一个数字对其进行测试,以确保它不会被拾取。我很难理解为什么前瞻导致不匹配,但是如果我们删除前瞻,它会匹配“8 月 6 日”。

/((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]{0,6})\s(\d){1,2}/

我的逻辑是,我在 8 月到 6 日之间对月份格式和空间应用了前瞻。下面的组(也就是(\d){1,2}比赛的结果)不会吗?

任何关于我为什么要考虑这个错误的指针将不胜感激!

4

1 回答 1

0

(?=((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]{0,6})\s)(\d){1,2}的正则表达式包含一个(?=((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]{0,6})\s)积极的前瞻,它需要一个月份名称(后跟空格)立即出现在当前位置的右侧,但随后的模式是(\d)匹配一个数字。由于没有月份名称可以以数字开头,因此它永远不会匹配任何字符串。

解决方案可能如下所示:

/\b(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]{0,6}\s*(\d{1,2})(?!\d)/

请参阅正则表达式演示 #1。该值将在第 1 组中。或者,由于大多数浏览器都支持后视:

/(?<=\b(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]{0,6}\s*)\d{1,2}(?!\d)/

查看另一个正则表达式演示

请注意,这(\d){1,2}是一个错误的模式,因为它将每个数字捕获到同一个捕获组内存插槽中,因此一直重写它,如果你有August 16,你仍然会得到6Group 1 值(你的输出)。

JS 演示:

const regex1 = /\b(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]{0,6}\s*(\d{1,2})(?!\d)/;
const regex2 = /(?<=\b(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]{0,6}\s*)\d{1,2}(?!\d)/;

const text = '10 people will be attending the Board of Directors meeting on August 6th';

console.log(regex1.exec(text)[1]); // => 6
console.log(regex2.exec(text)[0]); // => 6

于 2020-07-29T14:18:30.257 回答