В этом руководстве по регулярным выражениям Java мы научимся проверять, находятся ли несколько строк входного текста в пределах некоторого минимального и максимального предела, независимо от того, сколько всего символов встречается в строке.
Регулярное выражение для сопоставления количества строк будет зависеть от точных символов или последовательностей символов, используемых в качестве разделителей строк. На практике разделители строк могут различаться в зависимости от соглашения вашей операционной системы, приложения или предпочтений пользователя и т. д. Таким образом, написание идеального решения зависит от того, какие соглашения для указания начала новой строки должны поддерживаться.
Следующее решение, обсуждаемое в этом руководстве, поддерживает стандартные соглашения о переносе строк MS-DOS/Windows(«\r\n»), устаревшие соглашения Mac OS(«\r») и Unix/Linux/BSD/OS X(«\n»).
Регулярное выражение: \\A(?>[^\r\n]*(?>\r\n?|\n)){0,3}[^\r\n]*\\z
1. Объяснение регулярного выражения
\A # Утверждает позицию в начале строки.(?> # Группировать, но не захватывать и не сохранять позиции возврата:[^\r\n]* # Соответствует нулю или более символов, кроме CR и LF.(?> # Группировать, но не захватывать и не сохранять позиции возврата:\r\n? # Сопоставить CR с необязательным последующим LF(CRLF).| # Или:\n # Соответствует отдельному символу LF.) # Завершить незахватывающую атомарную группу.){0,4} # Конец группы; повторить от нуля до четырех раз.[^\r\n]* # Соответствует нулю или более символов, кроме CR и LF.\z # Утверждает позицию в конце строки.CR: Возврат каретки(\r\n)LF: Перевод строки(\n)
Регулярное выражение выше проверяет, что содержимое имеет минимум ноль строк и максимум 3 строки. Давайте проверим решение регулярного выражения.
2. Демонстрация
2.1. Проверка с нулевыми линиями
StringBuilder builder = new StringBuilder();String regex = "\\A(?>[^\r\n]*(?>\r\n?|\n)){0,3}[^\r\n]*\\z";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(builder.toString());System.out.println(matcher.matches());
Вывод программы:
true
2.2. Подтвердите двумя линиями
StringBuilder builder = new StringBuilder();builder.append("Test Line 1");builder.append("\n");builder.append("Test Line 2");builder.append("\n");String regex = "\\A(?>[^\r\n]*(?>\r\n?|\n)){0,3}[^\r\n]*\\z";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(builder.toString());System.out.println(matcher.matches());
Вывод программы:
true
2.3. Проверка с шестью линиями
StringBuilder builder = new StringBuilder();builder.append("Test Line 1");builder.append("\n");builder.append("Test Line 2");builder.append("\n");builder.append("Test Line 3");builder.append("\n");builder.append("Test Line 4");builder.append("\n");builder.append("Test Line 5");builder.append("\n");builder.append("Test Line 6");builder.append("\n");String regex = "\\A(?>[^\r\n]*(?>\r\n?|\n)){0,3}[^\r\n]*\\z";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(builder.toString());System.out.println(matcher.matches());
Вывод программы:
false
Я советую вам поэкспериментировать с приведенным выше простым регулярным выражением, чтобы попробовать больше вариаций.