Подтвердить что ты не робот

Regex, который будет соответствовать 6 символам, которые позволяют только цифры, ведущие и конечные пробелы

Регулярное выражение, которое я пытаюсь реализовать , должно соответствовать следующими данными:

  • 123456
  • 12345 
  •  23456
  •      5
  • 1     
  •       
  •   2   
  •  2345 

Он не должен соответствовать следующим образом:

  • 12 456
  • 1234 6
  •  1 6
  • 1 6

Он должен содержать всего 6 символов, включая цифры, ведущие и конечные пробелы. Это также может быть 6 символов только пробелов. Если используются цифры, между ними не должно быть пробелов.

Я пробовал следующие выражения безрезультатно:

^\s*[0-9]{6}$
\s*[0-9]\s*
4b9b3361

Ответ 1

Вы можете просто использовать шаблон *\d* * с ограничительным (?=.{6}$) lookahead:

^(?=.{6}$) *\d* *$

Смотрите демонстрацию regex

Пояснение:

  • ^ - начало строки
  • (?=.{6}$) - строка должна содержать только 6 символов, кроме новой строки
  • * - 0 + регулярные пробелы ( ПРИМЕЧАНИЕ для соответствия горизонтальному пространству - используйте [^\S\r\n])
  • \d* - цифры 0+
  • * - 0 + регулярные пространства
  • $ - конец строки.

Java-демонстрация (последние 4 - это тестовые примеры, которые должны потерпеть неудачу):

List<String> strs = Arrays.asList("123456", "12345 ", " 23456", "     5", // good
"1     ", "      ", "  2   ", " 2345 ",  // good
"12 456", "1234 6", " 1   6", "1    6"); // bad
for (String str : strs)
    System.out.println(str.matches("(?=.{6}$) *\\d* *"));

Обратите внимание, что при использовании в String#matches() вам не нужны строковые привязки ^ и final $, так как метод требует полного соответствия строк, привязывая шаблон по умолчанию.

Ответ 2

Вы также можете сделать:

^(?!.*?\d +\d)[ \d]{6}$
  • Отклик нулевой ширины (?!.*?\d +\d) гарантирует, что линии, имеющие пробелы между цифрами, не выбраны

  • [ \d]{6} соответствует желаемым строкам с шестью символами, имеющими только пробел и/или цифры.