Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.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
Java 正则表达式前瞻未按预期匹配_Java_Regex - Fatal编程技术网

Java 正则表达式前瞻未按预期匹配

Java 正则表达式前瞻未按预期匹配,java,regex,Java,Regex,我正在编写一个小型java程序来进行一点数据库清理,当日期与某些关键字出现在同一句话中时,我需要从大块文本中提取日期,我会发现一些我无法理解的奇怪行为。例如,以下正则表达式: "(?=.*(due|submit|deadline)[^\\d]*)" + "(january|february|march|april|may|june|july|august|september|october|november|december)" + "\\s*(0?[1-9]|[12][0-9]|3[01])(

我正在编写一个小型java程序来进行一点数据库清理,当日期与某些关键字出现在同一句话中时,我需要从大块文本中提取日期,我会发现一些我无法理解的奇怪行为。例如,以下正则表达式:

"(?=.*(due|submit|deadline)[^\\d]*)"
+ "(january|february|march|april|may|june|july|august|september|october|november|december)"
+ "\\s*(0?[1-9]|[12][0-9]|3[01])(th|rd|nd|st)*,*\\s*((19|20)\\d\\d)"
与此不匹配:

“必须在2013年6月19日星期三中午12点之前提交,届时将进行阅读。”


尽管关键字
“submit”
出现在日期之前。如果我去掉前瞻,字符串匹配。有人能看出我做错了什么吗?谢谢

您似乎忘记了look-ahead是零宽度,这意味着regex光标将设置在look-ahead开始检查其条件的位置。这意味着零件匹配

+ "(january|february|march|april|may|june|july|august|september|october|november|december)"
+ "\\s*(0?[1-9]|[12][0-9]|3[01])(th|rd|nd|st)*,*\\s*((19|20)\\d\\d)";
需要在“向前看”开始检查的位置之后立即存在

要解决此问题,您需要在
(一月|…
之前添加
*?
,以使月份存在于更远的地方,并通过前瞻检查和匹配(如
到期日之前的位置)

另外,为了避免多次使用“向前看”,请在字符串开头添加
^
,使其仅在字符串开头之后查找匹配项

所以你最后的正则表达式看起来像

    String regex = "^(?=.*(due|submit|deadline)[^\\d]*)"
            + ".*?(january|february|march|april|may|june|july|august|september|october|november|december)"
            + "\\s*(0?[1-9]|[12][0-9]|3[01])(th|rd|nd|st)*,*\\s*((19|20)\\d\\d)";


事实上,我不知道你为什么要用“向前看”这个词

    String regex = "(due|submit|deadline).*?"
            + "(january|february|march|april|may|june|july|august|september|october|november|december)"
            + "\\s*(0?[1-9]|[12][0-9]|3[01])(th|rd|nd|st)*,*\\s*((19|20)\\d\\d)";
也做你想做的事


word
submitted
不在您的正则表达式模式中。日期的模式也不是标准的。您为什么要检查
th | rd | nd | st
?@Braj这不重要,对吧?“submitted”包含您问题中的“submit”正则表达式。您还需要向我们展示您是如何使用真实的正则表达式的。@Pshemo修复了,小姐当我粘贴它时,我使用了一个向前看的括号,因为我只想捕获日期,而不想捕获字符串的其余部分,但这是一个简单的修复方法。谢谢you@user2559503我很高兴它能为您解决问题。从您熟悉“展望未来”这一事实来看,我假设您也知道
*
*?
,但为了以防万一,请阅读贪婪和不情愿的量词。