簡體   English   中英

在Java中使用正則表達式匹配空格或空格字符串

[英]Matching a whitespace or emptry string using regex in Java

我在java中有這個正則表達式

String pattern = "(\\s)(\\d{2}-)(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)(-\\d{4})(\\s)";

它按預期工作,但我有一個新的問題,以獲得一些有效的日期:

第一個問題

如果我有這個字符串It was at 22-febrero-1999 and 10-enero-2009 and 01-diciembre-2000我應該得到另一個字符串作為febrero-enero-diciembre而我只得到febrero-enero

第二個問題

如果我在像12-octubre-1989這樣的字符串中有一個日期,我會得到一個emptry String。

為什么我的模式在任何日期的開頭和結尾都有空格? 因為我必須在一個字符串中捕獲有效的月份,例如adsadasd 12-validMonth-2999 asd 11-validMonth-1989我應該同時獲得validMonth ,然后永遠不會在asdadsad12-validMonth-1989 asdadsad 23-validMonth-1989獲取字符串中asdadsad12-validMonth-1989 asdadsad 23-validMonth-1989在最后一個我應該得到最后一個validMonth

PD:我的java代碼是

String resultado = "";
String pattern = "(\\s)(\\d{2}-)(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)(-\\d{4})(\\s)";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(fecha);
while (m.find()) {
    resultado += m.group().split("-")[1] + "-";
}
return (resultado.compareTo("") == 0 ? "" : resultado.substring(0, resultado.length() - 1));

也許嘗試使用\\b而不是\\s

String pattern = "\\b(\\d{2}-)(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)(-\\d{4})\\b";

這只匹配第一個數字前面沒有另一個單詞字符(數字,字母或下划線)的字符串,最后一個數字后面沒有單詞字符。 我還刪除了\\b周圍的捕獲組,因為它總是一個零長度的字符串,如果匹配的話。

您可能希望使用單詞邊界:

\\b(\\d{2}-)(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)(-\\d{4})\\b

我相信有些月份可以進行一些優化(遺憾的是它可能降低可讀性,但應該加快速度):

\\b(\\d{2}-)((?:en|febr)ero|ma(?:rz|y)o|abril|ju[ln]io|agosto|(?:septiem|octu|noviem|diciem)bre)(-\\d{4})\\b

我不會使用邊界作為分隔符。
我建議使用空格或非數字,
或者沒有分類,並且在日期/年份中放入數字的驗證范圍。
通過這種方式,您可以捕獲更多嵌入日期
接近(相鄰)字母和下划線。

就像是:

 #  "(?<!\\d)\\d{2}-(?:enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)-\\d{4}(?!\\d)"

 (?<! \d )         # Not a digit before us
 \d{2} -           # Two digits followed by dash
 (?:               # A month
      enero
   |  febrero
   |  marzo
   |  abril
   |  mayo
   |  junio
   |  julio
   |  agosto
   |  septiembre
   |  octubre
   |  noviembre
   |  diciembre
 )
 - \d{4}           # Dash followed by four digits
 (?! \d )          # Not a digit after us

暫無
暫無

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

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