2012-02-10 24 views
-1

我想爲groovy中的matches創建一個模式。輸入範圍從0 to 100,但接受decimal value。我知道這可能是通過使用double數據類型,但作爲一個要求,我需要將此屬性的數據類型設置爲String,這就是爲什麼我需要爲String設置正確的匹配模式,以使其正常工作。可能的輸入:如何在groovy中編寫適當的正則表達式?

1) 1 - valid 
2) 1.5301 - valid 
3) 99.6732 - valid 
4) 99.1 - valid 
5) 100.1 - invalid 
6) 100 - valid 

非常感謝!

回答

2

這應該工作:

100(\.0+)?|([1-9]?[0-9])(\.[0-9]+)? 
+0

非常感謝您的幫助! – chemilleX3 2012-02-10 09:25:18

1

琥珀具有正確的正則表達式

由於在Groovy中展示這種的方式,你可以這樣做:

def testcases = [ 
    [ '1',  true ], 
    [ '1.5301', true ], 
    [ '99.6732', true ], 
    [ '99.1', true ], 
    [ '100.1', false ], 
    [ '100',  true ], 
] 

testcases.each { val, result -> 
    assert (val ==~ /100(\.0+)?|([1-9]?[0-9])(\.[0-9]+)?/) == result 
} 

不過,我可能會做類似:

testcases.each { val, result -> 
    try { 
    Double.parseDouble(val).with { 
     assert (it >= 0 && it <= 100) == result 
    } 
    } catch(ex) { 
    assert result == false 
    } 
} 

與正則表達式檢查範圍感覺有點魯莽的路線,採取

+0

我同意這樣做比正則表達式更好。 – Amber 2012-02-10 18:58:29

0

你可以(也應該)使用範圍雙打:

groovy:000> ((0.0d)..(100.0d)).containsWithinBounds(100.1d) 
===> false 
groovy:000> ((0.0d)..(100.0d)).containsWithinBounds(99.6732d) 
===> true 

而且從字符串得到一個雙:

groovy:000> ((0.0d)..(100.0d)).containsWithinBounds("99.6732" as double) 
===> true 
groovy:000> ((0.0d)..(100.0d)).containsWithinBounds("100.01" as double) 
===> false 
相關問題