Вы можете попробовать этот шаблон: (?=^[a-zA-Z0-9-_]{3,16}$).+
Обычно положительные прогнозные оценки (?=...)
используются, чтобы утверждать, что некоторые правила действительны, как вы хотите. Объяснение:
^
- соответствует началу строки
[a-zA-Z0-9-_]{3,16}
- соответствует не менее 3 и 16 не более символов в классе символов: a-zA-Z
- все буквы, [ 115] - цифры, -_
- дефис или подчеркивание
$
- конец строки
И если это утверждение успешно, то сопоставьте все с .*
Вам на самом деле не нужно регулярное выражение, чтобы решить это. Используйте старые добрые string.Split()
и имена процессов
var input = "Jeff, john45, ab, cd, peter-ivanov, @smith, sh, too_long_username, !lleg@l ch@rs, jeffbutt";
var listOfNames = input.Split(new[] {",", " "}, StringSplitOptions.RemoveEmptyEntries)
.Where(l => l.Length >= 3 && l.Length <= 18) // filter by length
.Where(l => l.All(c => char.IsDigit(c) || char.IsLetter(c) || c == '-')) // filter by spec chars
.ToList();
, теперь у вас есть список из четырех имен. Если вы хотите превратить его обратно в строку, просто объедините ваши имена:
var singleLine = string.Join(", ", listOfNames);
// singleLine is "Jeff, john45, peter-ivanov, jeffbutt"
Ваше собственное регулярное выражение \b([a-zA-Z0-9_-]){3,16}\b
достаточно хорошо, чтобы дать намеченное совпадение, но \b
не сможет выполнить свою работу и позволит частично сопоставить слово, подобное @smith
, чтобы дать вам smith
, потому что @
не часть символа слова и, следовательно, s
в smith
будет совпадать, поскольку точка между @
и s
действительно является границей слова. Вам понадобится другое регулярное выражение, обеспечивающее, чтобы перед словом / следовал пробел, а также запятая, а за некоторыми словами следуют запятые, и вы хотите их подсчитать. Попробуйте использовать это регулярное выражение,
(?<= |^)[a-zA-Z0-9_-]{3,16}(?=[ ,]|$)
Это должно дать вам совпадения только со словами, которые соответствуют вашим правилам.
Примечание: всегда держите -
либо в самом начале, либо в самом конце, когда он находится в наборе символов, в противном случае он иногда ведет себя странно и дает неожиданные результаты.