Представьте, что моя цель в программе - разобрать как можно больше вхождений "ab"
из строки.Я подхожу к этой проблеме с помощью следующего кода:
public static void main(String[] args)
{
final String expression = "^(\\s*ab)";
Scanner scanner = new Scanner("ab abab ab");
while (scanner.hasNext())
{
String next = scanner.findWithinHorizon(expression, 0);
if (next == null)
{
System.out.println("FAIL");
break;
}
else
{
System.out.println(next);
}
}
}
Знак в начале выражения должен запрещать что-либо, кроме пробелов в начале каждого чтения, как упомянуто здесь .Это сделано для того, чтобы запретить что-то вроде "cab"
или "c ab"
.На самом деле, я ожидаю, что null будет возвращен и FAIL будет напечатан на консоли, если произойдет один из этих двух случаев.Если я удаляю знак вставки из выражения, он отлично работает на вводе, таком как "ab abab ab"
, но не возвращает ноль для "c ab"
.С другой стороны, если я оставлю каретку, "c ab"
вернет ноль, как и ожидалось, но "ab abab ab"
не удастся.Как я могу сделать эту работу?
Редактировать
Мой оригинальный пост, возможно, был немного расплывчатым.Пример, который я привел выше, является более простой версией моей реальной проблемы.шаблон ab
является шаблоном-заполнителем, который я бы заменил на что-то более интересное, скажем, адрес электронной почты, регулярное выражение или шестнадцатеричное значение.
В моем приложении вход для сканера - это не строка, а поток ввода, о котором я ничего не знаю.Моя цель в цикле - читать значения по одному из входных данных и проверять их содержимое на соответствие некоторому шаблону.Если они это сделают, то я мог бы сделать что-то более интересное с ними.Если нет, то программа завершается.
В вышеприведенном примере я ожидал бы, что на вход ab abab выводим:
ab
ab
ab
ab
Я ожидаю, что c ab
выведет:
FAIL
и я ожидаю, что ab cab
выведет:
ab
FAIL