Как бы я ни ненавидел регулярные выражения, это отличное место для их использования. Вы получаете подтверждение данных, а также анализирует все в одном кадре с правильным использованием группировки.
^ (\ d {4})? (-)? (\ D {4})? $ даст вам 3 группы вывода, вы проверяете каждую из них, чтобы увидеть, получили ли вы значение, и принимать решения на основе этого, и в качестве бонуса вам гарантировано, что они являются 4-значными числами. Посмотрите на группы на странице Rubular, на которую я ссылаюсь. Если у вас есть значение в группе 1, то это начальный год, «-» во второй группе, тогда это диапазон, значение в группе 3 - конечный диапазон. Делает логику действительно простой, и вам не нужно делать все эти глупые манипуляции со строками и целочисленные тесты, которые предлагают другие решения.
Так как это домашнее задание, вот что заставляет задуматься, как использовать Pattern
и Matcher
, я не собираюсь делать все это за вас.
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main
{
public static void main(String[] args)
{
final List<String> inputs = Arrays.asList("1999-", "-2010", "1990-2000", "1967");
final Pattern p = Pattern.compile("^(\\d{4})?(-?)(\\d{4})?$");
int count = 0;
for (final String input : inputs)
{
final Matcher m1 = p.matcher(input);
m1.find();
System.out.format("Input: %d\n", count++);
for (int i=1; i <= m1.groupCount(); i++)
{
System.out.format("\tGroup %d = %s\n", i, m1.group(i));
}
}
}
}
Вот ожидаемый результат:
Input: 0
Group 1 = 1999
Group 2 = -
Group 3 = null
Input: 1
Group 1 = null
Group 2 = -
Group 3 = 2010
Input: 2
Group 1 = 1990
Group 2 = -
Group 3 = 2000
Input: 3
Group 1 = 1967
Group 2 =
Group 3 = null
Как это работает:
^
- начало в начале строки
(\d{4})?
- это ищет ровно 4 цифры \d
, а ()
говорит, что группа находит то, что вы найдете, ?
означает, что эта группа необязательна для совпадения, группа будет == null
(-)?
- это выглядит для тире, ?
делает его необязательным, ()
группирует результаты по выше
(\d{4})?
- это ищет ровно 4 цифры \d
, а ()
говорит, что группа находит то, что вы найдете, ?
означает, что эта группа необязательна для совпадения, группа будет == null
$
- соответствует концу строки
Упражнение, оставленное читателю: Два случая, для которых он не «проверяет», - это пустая строка и «-», оба из которых следует рассматривать как «особые» случаи в зависимости от какой должна быть ваша бизнес-логика.