Как написать правильное регулярное выражение в Groovy? - PullRequest
0 голосов
/ 10 февраля 2012

Я хотел создать шаблон для моего matches в Groovy. Входные данные должны быть в диапазоне от 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 ]

2 голосов
/ 10 февраля 2012

Это должно работать:

100(\.0+)?|([1-9]?[0-9])(\.[0-9]+)?
1 голос
/ 10 февраля 2012

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

Поскольку проверка диапазонов с регулярным выражением кажется чем-то вроде безрассудного пути

0 голосов
/ 15 февраля 2012

Вы можете (и должны) использовать диапазон двойников:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...