![](/img/trans.png)
[英]Extract specific values or substrings from long string using regex in 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/15
, 6/15/12
, 06/15/12
, 15/6/12
, 15/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]
, century
和year
可能是空的。
\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)
來導致正則表達式不匹配,如果后跟th
, rd
或nd
。
你究竟是什么問題? 您應該首先閱讀一些有關正則表達式的指南。
你需要一個返回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.