Как получить несовпадающие символы? - PullRequest
1 голос
/ 01 мая 2019

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

public const string ValidUserNamePattern = @"^(?=.{5,53}$)([\p{L}\w][.!_-]?)*$";

Это должно принимать строки длиной от 5 до 53 символов, все символы, включая диакритические знаки и специальные знаки '.', '!', '_', '-'.

Если кто-то вводит имя, например d'Agostini или van den Helde, у нас есть недопустимые символы (пробелы и '). Как я могу напечатать только недействительных символов?

public const string ValidUserNamePattern = @"^(?=.{5,53}$)([\p{L}\w][.!_-]?)*$";

var validString = "TestUsrNèüäme";
var invalidString = "Te st|^us r";
var validUserNameRegEx = new Regex(OpManConstants.ValidUserNamePattern, RegexOptions.Compiled);

if (!validUserNameRegEx.IsMatch(invalidString))
{
    // How to get NOT MATCHING character or in other words
    // how to get all characters causing the Regex NOT to match?
}

Есть идеи, как это можно сделать в C #?

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Что вы могли бы сделать - это сначала проверить / сопоставить, если строка содержит недопустимые символы, используя отрицательный символьный класс и используя \p{L}, и добавьте символы .!_-, которые вы разрешите.

[^\p{L}.!_-]

Regex demo | C # демо

0 голосов
/ 01 мая 2019

Как я уже сказал в комментарии, решение состоит в том, чтобы найти любой символ, который НЕ соответствует действительному символу.
Ваше «правильное регулярное выражение символа» равно [\p{L}\w.!_-], поэтому ваше «неправильное регулярное выражение символа» будет [^\p{L}\w.!_-].

protected const string ValidUserNameCharacters = @"\p{L}\w.!_-";

public const string ValidUserNamePattern = @"^(?=.{5,53}$)([" + ValidUserNameCharacters + @"]?)*$";
public const string InvalidUserNamePattern = @"([^" + ValidUserNameCharacters + "])";

var invalidString = "Te st|^us r";
var validUserNameRegEx = new Regex(OpManConstants.ValidUserNamePattern, RegexOptions.Compiled);
var invalidUserNameRegEx = new Regex(OpManConstants.InvalidUserNamePattern, RegexOptions.Compiled);

if (!validUserNameRegEx.IsMatch(invalidString))
{
    var matches = invalidUserNameRegEx.Matches(invalidString);
    var builder = new StringBuilder();
    foreach (var match in matches.Cast<Match>())
    {
        builder.AppendLine("'" + match.Groups[0] + "' at char " + (match.Index + 1));
    }

    Console.WriteLine(builder.ToString());
}

Вывод:

' ' at char 3  
'|' at char 6  
'^' at char 7  
' ' at char 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...