Regex первая буква каждого слова в верхнем регистре, разделенные пробелами и длиной от 3 до 29 символов ... C# - PullRequest
1 голос
/ 01 апреля 2020

Недавно мне было поручено выполнить невыполнимую задачу (по моей оценке), чтобы создать шаблон регулярного выражения, в котором я должен иметь возможность проверять несколько слов в одном предложении или текстовом поле в соответствии со следующими рекомендациями:

  • Каждое имя / слово должно иметь первую букву в верхнем регистре
  • Имена / Слова, разделенные пробелами
  • Каждое имя / слово длиной не более 3 символов
  • И текст предложения или текстового поля не может быть длиннее 20 символов

Пример: Joseph Gordon Levitt

Длина этого примера ровно 20 символов, каждое имя (или слово) длиннее 3 символов, разделенных пробелы, и первая буква каждого имени (или слова) в верхнем регистре.

Я попробовал этот шаблон регулярных выражений ^[A-Z]{1}[a-zA-Z\s]{3,20}$. Это работает для некоторых строк, но не для всех.

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Один из вариантов такой:

^(?!.{21})[A-Z][a-z]{2,}(\s[A-Z][a-z]{2,})*$

Демо: https://dotnetfiddle.net/oWjSI4

enter image description here

1 голос
/ 01 апреля 2020

Давайте пройдемся по требованиям:

  • Каждое имя / слово должно начинаться с заглавной буквы : использовать \p{Lu}
  • Имена / Слова, разделенные пробелами : Используйте \s+ (1 или более пробелов) / \s (только один пробел)
  • Каждое имя / слово длиной не более 3 символов : таким образом, шаблон слова будет \p{Lu}\p{L}{2,} - начиная с заглавной буквы, а затем имея 2 или более букв
  • и предложение или текстовое поле не может быть длиннее 20 символов : использовать положительный прогноз сразу после ^ / \A (начало строки): (?!.{21}) или (?=.{0,20}$) .

Полученное регулярное выражение будет выглядеть как

^(?!.{21})\p{Lu}\p{L}{2,}(?:\s\p{Lu}\p{L}{2,})*$
^(?=.{0,20}$)\p{Lu}\p{L}{2,}(?:\s\p{Lu}\p{L}{2,})*$

Или, если между словами может быть 1+ пробелов

^(?!.{21})\p{Lu}\p{L}{2,}(?:\s+\p{Lu}\p{L}{2,})*$
^(?=.{0,20}$)\p{Lu}\p{L}{2,}(?:\s+\p{Lu}\p{L}{2,})*$

ПРИМЕЧАНИЕ : Если вы когда-нибудь протестируете его на строке, которая может заканчиваться символом \n, символом новой строки, замените $ на \z.

См. Демонстрационную версию regex .

Подробности

  • ^ - начало строки
  • (?=.{0,20}$) - в строке должно быть от 0 до 20 символов без перевода строки до конца
  • \p{Lu} - заглавная буква
  • \p{L}{2,} - две или более букв
  • (?:\s\p{Lu}\p{L}{2,})* - 0 или более повторений:
    • \s - пробел (или 1 + пробелы, если используется \s+)
    • \p{Lu}\p{L}{2,} - заглавная буква, а затем любые две или более букв
  • $ - конец строки (\z - это самый конец строки).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...