2017-07-07 62 views
0

我在這裏遇到了正則表達式的問題。Java正則表達式捕獲嵌套匹配

說我有這個輸入:

608094.21.1.2014.TELE.&BIG00Z.1.1.GBP 

我正則表達式看起來像這樣

(\d\d\d\d\.\d?\d\.\d?\d)|(\d?\d\.\d?\d\.\d?\d?\d\d) 

我想提取的日期2014年1月21日出來的字符串,但我得到的是

8094.21.1 

我覺得我的問題在於,那21.1.2014在(錯誤)匹配之前開始。有沒有一種簡單的方法可以使匹配器不是在比賽結束之後尋找下一場比賽,而是在比賽開始之前的一個角色之前?

+0

也許單獨正則表達式是不是最好的工具這個工作。 –

+0

你想做什麼就像「\ d *(\ d {4}。\ d {1,2}。\ d {1,2})|(\ d {1,2} \。\ d { 1,2}。\ d {2,4})「 – Secespitus

+0

您可以添加更多的示例來清除它。 – anubhava

回答

1

你可以使用這樣的正則表達式:

\d{1,2}\.\d{1,2}\.\d{4} 

Working demo

或縮短它與用途:

(\d{1,2}\.){2}\d{4} 
+0

謝謝,工作完美 –

1

如果日期由點總是包圍着:

\.(\d\d\d\d\.\d?\d\.\d?\d|\d?\d\.\d?\d\.\d?\d?\d\d)\. 
0

我希望這會幫助你。

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Test { 
    public static void main(String[] args) { 
     String x = "608094.21.1.2014.TELE.&BIG00Z.1.1.GBP"; 
     String pattern = "[0-9]{2}.[0-9]{1}.[0-9]{4}"; 

     // Create a Pattern object 
     Pattern r = Pattern.compile(pattern); 

     // Now create matcher object. 
     Matcher m = r.matcher(x); 
     if (m.find()) { 
      System.out.println("Found value: " + m.group()); 
     }else { 
      System.out.println("NO MATCH"); 
     } 
    }