Regex Удалите ненужные символы с определенными правилами c # - PullRequest
0 голосов
/ 19 марта 2019

Я хочу удалить все ненужные символы, чтобы имя могло быть действительным, вот правила:

• Имеет длину от 3 до 16 символов
• Содержит только буквы, цифры, дефисы и подчеркивания
• Не имеет избыточных символов до, после или между

Это входные данные:

Джефф, john45, ab, cd, peter-ivanov, @smith, sh,too_long_username,! lleg @ l ch @ rs, jeffbutt

Мой Regex до сих пор: https://regexr.com/4ahls,, и я хочу удалить:
@ smith
! lleg @ l
ch @ rs

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Ваше собственное регулярное выражение \b([a-zA-Z0-9_-]){3,16}\b достаточно для того, чтобы дать намеченное совпадение, но \b не сможет выполнить свою работу и позволит частично сопоставить слово, такое как @smith, чтобы дать вам smith, поскольку @ не соответствует часть символа слова и, следовательно, s в smith будет совпадать, поскольку точка между @ и s действительно является границей слова. Вам понадобится другое регулярное выражение, обеспечивающее, чтобы за словом предшествовал / следовал пробел, а также запятая, за некоторыми словами следуют запятые, и вы хотите их подсчитать. Попробуйте использовать это регулярное выражение,

(?<= |^)[a-zA-Z0-9_-]{3,16}(?=[ ,]|$)

Демо

Это должно дать вам совпадения только с теми словами, которые соответствуют вашим правилам.

Примечание: всегда держите - либо в самом начале, либо в самом конце, когда он находится в наборе символов, в противном случае он иногда ведет себя странно и дает неожиданные результаты.

0 голосов
/ 19 марта 2019

Вам на самом деле не нужно регулярное выражение, чтобы решить это.Используйте старые добрые 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"
0 голосов
/ 19 марта 2019

Вы можете попробовать этот шаблон: (?=^[a-zA-Z0-9-_]{3,16}$).+

Как правило, положительные прогнозы (?=...) используются, чтобы утверждать, что некоторые правила действительны, как вы хотите.Объяснение:

^ - сопоставить начало строки

[a-zA-Z0-9-_]{3,16} - сопоставить не менее 3 и 16 не более символов в классе символов: a-zA-Z - все буквы, 0-9 - цифры, -_ - дефис или подчеркивание

$ - конец строки

И если это утверждение выполнено успешно, сопоставьте все с .*

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...