2011-10-08 109 views
0

所以我想我的輸入爲下列之一:搞清楚,並檢查該模式

0 =任意整數

0,00, 000,0:0,00:0 , 000:0

基本上0-999,其次是一個可選冒號和0-9。我使用的模式是

([0-9]|([0-9][0-9])|([0-9][0-9][0-9]))|(([0-9]|([0-9][0-9])|([0-9][0-9][0-9]))&&\3A&&[0-9])

這是代碼模式冗餘非工作,還是錯?它會真的做我想做的事嗎?我通常會運行它並對其進行測試,但需要一段時間才能利用我的應用程序來測試代碼。

+4

所以,你想我們來測試它嗎? – home

+1

你的正則表達式是錯誤的。使用在線工具/網站或離線工具,如regexbuddy或expresso。 – FailedDev

+0

如果您有像這樣的小型獨立可測試項目,只需創建一個獨立程序,在您不使用JUnit或其他程序時調用它。 –

回答

0

首先,需要制定一個正則表達式的每個數字0和999假設009之間匹配是一個有效的數字可以基本匹配的數字三個序列([0-9]),並且使所述第一兩個可選:

[0-9]?[0-9]?[0-9] 

上述正則表達式匹配999919009,但不是12349999

如果009是不是有效的數字,那麼你就需要排除從第一兩組0以上,得到以下特性:

([1-9][0-9]|[1-9])?[0-9] 

也就是說,如果你有一個百位數,那麼就一定不能0([1-9]),如果你有一個十位數(但不是一個數字),那麼它也不能是0(正則表達式中的第二個[1-9])。

最後,你需要包括可選部分,這基本上是一個逗號,後跟一個數字,得到最終的表達:

([1-9][0-9]|[1-9])?[0-9](:[0-9])? 

然後,您可以運行一個簡單的獨立的程序,一些簡單的測試:

public static void main(String... args) { 
    Pattern p = Pattern.compile("(?:[1-9][0-9]|[1-9])?[0-9](?::[0-9])?");  
    System.out.println(p.matcher("999").matches()); 
    System.out.println(p.matcher("1234").matches()); 
    System.out.println(p.matcher("9").matches()); 
    System.out.println(p.matcher("19").matches()); 
    System.out.println(p.matcher("999:9").matches()); 
    System.out.println(p.matcher("12:99").matches()); 
} 
+0

非常感謝!我一直在尋找在線信息,但從人類獲得解釋總是最有幫助的! – LibertasMens

2

縱觀它:

  • &&沒有特殊字符,他們必須從字面上匹配。因此,這部分的RE將永遠不符合你的例子。
  • \3A應該是\\x3A。否則,它會匹配代碼3後跟'A'的字符。
  • 使用的重複數量{n,m}而不是多個|更容易閱讀和理解

    Pattern p = Pattern.compile("\\d{1,3}|\\d{1,3}:\\d"); 
    
+0

這是不正確的。在0後跟:和一個數字將會有2個匹配而不是一個,因爲你的正則表達式的第一部分總是匹配。 – FailedDev

+0

@FailedDev:我無法關注。只有第二部分纔會匹配'0:0',因爲使用Matcher.match,正則表達式必須匹配完整的輸入。第一部分不匹配完整的輸入。證明:在((\\ d {1,3})|(\\ d {1,3}):((\\ d))中添加三個組到我的正則表達式中,顯示對於「0:0」 'group(1)'總是'null' - 只有第二部分匹配。 –

+0

我以爲輸入是完整的行:0,00,000,0:0,00:0,000:0而不僅僅是一個單獨的「集合」 – FailedDev

0

試試這個:

try { 
    Pattern regex = Pattern.compile("\\d{1,3}(?::\\d)?"); 
    Matcher regexMatcher = regex.matcher(subjectString); 
    while (regexMatcher.find()) { 
     // matched text: regexMatcher.group() 
     // match start: regexMatcher.start() 
     // match end: regexMatcher.end() 
    } 
} catch (PatternSyntaxException ex) { 
    // Syntax error in the regular expression 
} 

它應該讓你去。

+0

請注意,這個問題也被標記爲'Java',所以C#語法和類不是100%兼容的。 –

+0

@ A.H。謝謝你的提示。將編輯答案。 – FailedDev

0

這是一個工作模式,使用JUnit,您可以使用一些示例數據對其進行測試。這段代碼需要輸入驗證 - 所以如果你想從字符串中提取這些值,那麼這是一種不同的模式,需要進行不同的測試。

Pattern pattern = Pattern.compile("^\\d{1,3}(?::\\d)?$"); 

List<String> samples = Arrays.asList("0", "00", "000", "0:0", "00:0", "000:0"); 
List<String> failSamples = Arrays.asList("0000", "0000:0", "0:00", "00:00", "000:00"); 
for (String sample : samples) 
{ 
    assertTrue(sample, pattern.matcher(sample).matches()); 
} 
for (String failSample : failSamples) 
{ 
    assertFalse(failSample, pattern.matcher(failSample).matches()); 
}