如何在groovy中编写正确的正则表达式?

时间:2012-02-10 08:26:56

标签: regex groovy expression

我想在groovy中为matches创建一个模式。输入范围应为0 to 100,但接受decimal value。我知道这可以通过使用double数据类型来实现,但作为一项要求,我需要将此属性的数据类型设置为String,这就是为什么我需要设置匹配的正确模式的原因String使其正常工作。可能的输入:

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

非常感谢你!

3 个答案:

答案 0 :(得分:2)

这应该有效:

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

答案 1 :(得分:1)

Amber有正确的正则表达式

作为在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
  }
}

用正则表达式检查范围感觉就像是一条愚蠢的路线

答案 2 :(得分: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