2017-07-07 92 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"); 
     } 
    }