2

我需要提取长度超过 3 位的数字,并且不包括给定范围内的年份(例如,在19xx和之间2020,其中XX始终位于字符串的末尾)。

我目前正在使用以下模式:

/(?!19[0-9]{2}|200[0-9]|201[0-9]|202[0-9])\d{3,}$/i

当我用"something 2012"测试表达式时,我总是得到结果012。我需要得到null.

var s = "moose high performance drive belt 2012";
s.match(/(?!19[0-9]{2}|200[0-9]|201[0-9]|202[0-9])\d{3,}$/i);

为什么这个表达式不正确地匹配日期的结尾?

4

2 回答 2

2

它丢弃something ,然后尝试匹配2012但由于您的否定前瞻断言而失败,然后尝试匹配012,它成功了,因为确实012与您的否定前瞻断言不匹配。

更新:

这并不漂亮,但它是一种解决方案。也许你可以简化它。

    (?!(?:19[0-9]{2}|200[0-9]|201[0-9]|202[0-9])\D)(?<!\d)\d{3,}

在此处查看演示:http ://rubular.com/r/FLiehrUEp8 。

于 2012-06-26T18:33:21.957 回答
1

对于1900 - 2029 年,它应该是正则表达式 \b(\d+)\b(?<!(?:19\d{2}|20[0-2]\d))

于 2012-06-26T20:38:24.720 回答