Вы, кажется, неправильно поняли значение скобочной записи [...]
.Он создает класс символов , что означает, что он соответствует ровно одному символу, который может быть любым из символов в ...
.(Существует ряд специальных синтаксисов для большего контроля над тем, каким символам он может соответствовать, но это основная идея.) Так, например, этот ваш шаблон:
^W[W{10,20}R{1}]W$
требует, чтобы строка была точнотри символа в длину;что первый символ будет W
;что вторым символом будет W
, {
, 1
, 0
, запятая, 2
, }
или R
;и что третий символ будет другим W
.
В этом случае вы действительно должны написать:
^W+RW+$
, чтобы убедиться, что строка полностью состоит из W
s, кроме одного R
, и что он начинается и заканчивается W
s.(Вам не нужно беспокоиться о количестве W
с, поскольку к этому моменту вы уже убедились, что длина строки ровно 22 символа.)
Отредактированодобавить: Кстати, замечательно, что у вас есть юнит-тесты, но у вашего метода такой узкий интерфейс - он принимает строку, выполняет кучу проверок и просто возвращает true
или false
-что это на самом деле не поддается юнит-тестированию.Если ваш модульный тест обнаружит, что метод ошибочно возвращает false
для данной строки, у вас будет очень мало информации о том, что пошло не так, поэтому это не сильно поможет в обнаружении проблемы.(Вы уже видели это для себя.) Еще хуже, если ваш модульный тест обнаружит, что метод правильно возвращает false
для данной строки, у вас все еще нет возможности быть уверенным, что она вернуласьfalse
по правильной причине .Так что это не очень помогает в проверке правильности вашего кода.Есть несколько способов решить эту проблему:
- Вы можете создать отдельный метод для каждого правила проверки, а затем
checkFileValidLine
вызовет каждый из этих методов для проверки строки.Таким образом, вы можете иметь юнит-тесты для этих методов (в дополнение к кратким юнит-тестам для checkFileValidLine
, чтобы убедиться, что он вызывает эти методы и возвращает правильный результат).(Такой подход я бы рекомендовал.) - Вы можете создать вспомогательный метод, который выполняет те же проверки, что и текущий метод, но вместо возврата
true
для правильной строки и false
дляневерный, он может вернуть null
для правильной строки и (например) "line.length != 22"
для неверной.Затем ваши модульные тесты могут убедиться, что точно сработало правильное правило проверки, а checkFileValidLine
может просто вернуть true
, если этот вспомогательный метод возвратил null
.