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

发布于 2025-01-04 10:41:35 字数 349 浏览 2 评论 0原文

我想在 groovy 中为我的 matches 创建一个模式。输入范围应为 0 到 100,但接受十进制值。我知道可以通过使用 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

非常感谢!

I wanted to create a pattern for my matches in groovy. The input should range from 0 to 100, but accepts decimal value. I know that this is possible by using the double datatype, but as a requirement I need to set the datatype of this property as a String that's why I need to set up the correct pattern of the matches for the String for it to work properly. Possible input:

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

Thank you so much!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

眉目亦如画i 2025-01-11 10:41:35

这应该有效:

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

This should work:

100(\.0+)?|([1-9]?[0-9])(\.[0-9]+)?
心如荒岛 2025-01-11 10:41:35

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
  }
}

因为使用正则表达式检查范围感觉有点鲁莽。

Amber has the correct regular expression

As a way of demonstrating this in Groovy, you can do:

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
}

However, I would probably do something like:

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

As checking ranges with a regular expression feels like a bit of a foolhardy route to take

自找没趣 2025-01-11 10:41:35

您可以(并且应该)使用一系列双精度数:

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

You can (and should) use a range of doubles:

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

And getting a double from string:

groovy:000> ((0.0d)..(100.0d)).containsWithinBounds("99.6732" as double)
===> true
groovy:000> ((0.0d)..(100.0d)).containsWithinBounds("100.01" as double) 
===> false
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文