Number of Lines Validation Regular Expression

Validating the number of lines in text is essential for forms, comments, descriptions, and multi-line input fields. Regular expressions can enforce minimum, maximum, or specific line count ranges to ensure content meets formatting requirements. This is particularly useful for limiting feedback forms, code snippets, addresses, and other structured text inputs. For validating character length of text, see the text length validation article.

Line Range Validation (5-20 lines)

This pattern validates that text contains between 5 and 20 lines, inclusive. This is useful for multi-line input fields like comments, descriptions, or addresses where you want to enforce both minimum and maximum line constraints.

^(?:[^\n]*\n){4,19}[^\n]*$

Explanation

  • ^ - Start of the string.
  • (?:[^\n]*\n) - Non-capturing group that matches any content except newline, followed by a newline character. This represents one complete line.
  • {4,19} - Quantifier requiring 4 to 19 occurrences of the preceding group (matching lines 1-19, with the final line matched separately).
  • [^\n]* - Matches the final line, which may not end with a newline character.
  • $ - End of the string.

Note: The pattern matches {4,19} newlines plus one final line = 5-20 total lines. For N lines, use {N-1} as the upper bound in the quantifier.

Implementation

const lineRangeRegex = /^(?:[^\n]*\n){4,19}[^\n]*$/;
const isValidLineCount = (text) => lineRangeRegex.test(text);

// For configurable min/max:
function validateLineCount(text, min, max) {
  const lines = text.split('\n').length;
  return lines >= min && lines <= max;
}

Test Cases

Test CaseValid
5 lines (minimum boundary)
10 lines (middle range)
20 lines (maximum boundary)
1 line (below minimum)
4 lines (below minimum)
21 lines (above maximum)
Empty string
5 lines with empty line

Minimum Line Validation (5+ lines)

This pattern validates that text has a minimum of 5 lines with no upper limit. This is useful for fields like detailed descriptions, feedback forms, or code snippets where you want to ensure sufficient content without limiting maximum length.

^(?:[^\n]*\n){4,}[^\n]*$

Explanation

  • ^ - Start of the string.
  • (?:[^\n]*\n) - Non-capturing group matching any content followed by a newline (one complete line).
  • {4,} - Quantifier requiring at least 4 occurrences with no upper limit (matching lines 1-4+, with the final line matched separately).
  • [^\n]* - Matches the final line.
  • $ - End of the string.

Implementation

const minLinesRegex = /^(?:[^\n]*\n){4,}[^\n]*$/;
const hasMinimumLines = (text) => minLinesRegex.test(text);

Test Cases

Test CaseValid
5 lines (minimum boundary)
10 lines
26 lines (well above minimum)
4 lines (below minimum)
1 line
Empty string
3 lines

Maximum Line Validation (0-20 lines)

This pattern validates that text does not exceed 20 lines. It allows any line count from 0 (empty string) up to 20 lines. This is useful for fields like brief comments, summaries, or short descriptions where you want to limit verbosity.

^(?:[^\n]*\n){0,19}[^\n]*$

Explanation

  • ^ - Start of the string.
  • (?:[^\n]*\n) - Non-capturing group matching any content followed by a newline.
  • {0,19} - Quantifier allowing 0 to 19 occurrences of the preceding group (matching 0-19 newlines, with the final line matched separately).
  • [^\n]* - Matches the final line (which could be empty).
  • $ - End of the string.

Implementation

const maxLinesRegex = /^(?:[^\n]*\n){0,19}[^\n]*$/;
const hasMaximumLines = (text) => maxLinesRegex.test(text);

Test Cases

Test CaseValid
Empty string
1 line
5 lines
20 lines (maximum boundary)
21 lines (above maximum)
26 lines (well above maximum)

Alternative: String Split Approach

For dynamic or complex line count validation, using string manipulation methods is often more practical than regex. This approach provides better readability, easier maintenance, and handles edge cases more reliably. The code examples above include both regex and programmatic approaches for flexibility.