簡體   English   中英

使用Java正則表達式從長字符串驗證日期

[英]Using Java regex to validate date from a long string

我正在嘗試編寫一個Java例程,它可以解析長字符串中的日期,即給定字符串:

"Please have the report to me by 6/15, because the shipment comes in on 6/18" 

正則表達式將找到6/15和6/18。 我查看了Stack Overflow和其他地方,並且大多數日期正則表達式的例子只是驗證給定字符串是否是日期,而不是在更大量的文本中查找日期。 理想情況下,我想一個正則表達式,可以識別所有的主要途徑人們的數字寫日期,即6/156/15/1206/15/1215/6/1215/06/12 ,雖然為了cla的目的,也許最好將它們分成不同的正則表達式。 我是regexes的新手(兩天前我剛開始學習它們)和正則表達式對我來說仍然有點神秘,所以我很欣賞任何正則表達式建議的詳細解釋。

如果您沒有打擾范圍檢查,這就足夠了:

(\d{1,2})/(\d{1,2})(?:/(\d{4}|\d{2}))?

要檢查你不能做2/29/2001但可以做2/29/2000 ,你真的想在regexp完成它的工作后做,或者你最終會在庇護。

編輯:更好的是,隔離世紀,並防止像2/193這樣的事情(由Alex的問題提示,即使這是一個單獨的問題):

\b(\d{1,2})/(\d{1,2})(?:/(\d{2})?(\d{2}))?\b

每場比賽你會得到4次: [month, day, century, year]centuryyear可能是空的。

\d{1,2}/\d{1,2}(?:/(?:\d{2}){1,2})?

這是細分:

  • \\d{1,2}匹配1或1位數
  • /后跟一個/
  • \\d{1,2}后跟1或2個數字
  • (?:/(?:\\d{2}){1,2})? 然后是可選的斜線和2或4位數年份

從匹配中,您可能希望使用Java DateParse解析它們,而不是嘗試將所有驗證規則放在正則表達式中。

您可能希望保護分數以及1/4th這可以通過在正則表達式中附加負前瞻:(?! (?!th|rd|nd)來導致正則表達式不匹配,如果后跟thrdnd

你究竟是什么問題? 您應該首先閱讀一些有關正則表達式的指南。

你需要一個返回String中每個匹配的方法,如下所示:p是正則表達式,text是你的文本。

private LinkedList<String> matches(String p, String text) {
    LinkedList<String> results = new LinkedList<String>();

    Pattern pattern = Pattern.compile(p);
    Matcher matcher = pattern.matcher(text);

    while (matcher.find()) {
        results.add(matcher.group());
    }

    return results;
}

您可以使用|分隔每個日期模式

如果將正則表達式的一部分放入大括號(...)中,則將此部分視為“組”。 因此,您可以從匹配的字符串中提取單個數字(如果您願意)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM