Java 正则表达式负前瞻,意外结果

Java 正则表达式负前瞻,意外结果,java,regex,Java,Regex,我有以下案文: Jul 31, 2015 - Aug 27, 2015 Jul 31, 2015 - Aug 27, 2015 Aug 27, 2015 Jul 31, 2015 Data1 Jul 31, 2015 Data2 Jul 31, 2015 Jul 31, 2015 我想匹配所有日期,除了旁边有日期的日期。所以基本上是从第三行开始的日期 我写了这个正则表达式 ((?:Jul | Aug)\W\d+\W+\d+)这将查找文本中的所有日期 然后,为了实现我想要的,我想我必须像这样使用

我有以下案文:

Jul 31, 2015 - Aug 27, 2015
Jul 31, 2015 - Aug 27, 2015
Aug 27, 2015
Jul 31, 2015 Data1
Jul 31, 2015 Data2
Jul 31, 2015
Jul 31, 2015
我想匹配所有日期,除了旁边有日期的日期。所以基本上是从第三行开始的日期

我写了这个正则表达式
((?:Jul | Aug)\W\d+\W+\d+)
这将查找文本中的所有日期

然后,为了实现我想要的,我想我必须像这样使用消极的前瞻
((?:七月|八月)\W\d+\W+\d+(?!-2015年8月27日))

但结果并不是我所期望的。我做错了什么


这应该适合您:

(?<!.)(?:Jul|Aug)\W\d+\W+\d+\b(?! - Aug 27, 2015)
(?

编辑:对不起,我将您的问题理解为“匹配3行”而不是“第3行并向前”

您可以使用锚定
^
$
强制您的正则表达式引擎从字符串的开头和结尾匹配,并在您的负面展望中使用
*

^((?:Jul|Aug)\W\d+\W+\d+)(?!.*(?:Jul|Aug)\W\d+\W+\d+).*(?:$|)
见演示

如果你想拒绝,你也可以用消极的眼光看后面:

(?<! - )((?:Jul|Aug)\W\d+\W+\d+)(?!.*(?:Jul|Aug)\W\d+\W+\d+)
(?

请参见演示

仅使用锚和单词边界

"(?m)^(?:Jul|Aug)\\W\\d+\\W+\\d+\\b(?! - Aug 27, 2015$).*"

^(?\w{3})(?\d{1,2})、(?\d{4})(?!-\w{3}\s+\d{1,2}、\d{4})[\t]*(?*?*?)$

这有点冗长,但似乎效果很好。

谢谢Kasra,但显然我在最初的问题中不是很清楚。我不想使用锚,因为数据与我在上面第一篇文章中给出的数据不完全相同。请检查此项,以获得更准确的数据演示:我想找到所有日期,除了类似的日期(Date-Date)。@prettyvoid欢迎!让我看看谢谢,最后一个表达式是我需要的!尽管我仍然需要时间来完全理解它。您能告诉我是否可以进一步扩展该表达式以排除“到达”的日期吗在它之前?就像你最后一个链接中的最后一个匹配。还有一件事,你能解释一下我最初在这个链接中写的正则表达式中发生了什么吗?很抱歉,我正在学习正则表达式,我保证。@prettyvoid是的,将它添加到负片后视上,在你的链接中,你已经在最后一个
\d+
之后放置了负片前视所以它不匹配。请查看我对Kasra的评论。不幸的是,这不是我想要的。再次感谢:)我希望看到你的尝试Raj,即使Kasra已经得到了它。
"(?m)^(?:Jul|Aug)\\W\\d+\\W+\\d+\\b(?! - (?:Jul|Aug)\\W\\d+\\W+\\d+$).*"