2013-10-09 3 views
1

Мне нужно регулярное выражение для проверки имени пользователя с помощью RegularExpressionAttribute. Он должен совпадать с именем пользователя, которое не содержит значения по умолчанию для requestPathInvalidCharacters (<,>, *,%, &,:, \,?).Регулярное выражение для запроса значения по умолчаниюPathInvalidCharacters

Так оно и должно соответствовать

AAFA.

aaf8-а

AAFA

Он не должен соответствовать

aa<fa

ААР> а

ААР * а

AAFA *

ААР% в

ААР &

ААР: а

ААР \ а

ААР

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

^(?!.*(<|>|\*|%|&|:|\\|\?).*)$ 
[Fact] 
    public void CanValidateAgainstInvalidCharacter() 
    { 
     var result = true; 
     Assert.True(result); 
 var listWeDontWant = @"<,>,*,%,&,:,\,?"; 
     var inner = listWeDontWant.Split(',').Select(x => Regex.Escape(x)).Aggregate((s, s1) => s + "|" + s1); 
     //inner = @"\\"; 
     var pattern = @"^(?!.*(" + inner + ").*)$"; 

     Debug.WriteLine(pattern); 

     //var isMatch = ; 

     //Debug.WriteLine(isMatch); 
     pattern = @"^[^<>*%&:\\\?]+$"; 
     Assert.False(Regex.IsMatch("aaf\a", pattern)); 

     // Assert.True(Regex.IsMatch("aafa.", pattern)); 
     // Assert.True(Regex.IsMatch("aaf8-a", pattern)); 
     //Assert.True(Regex.IsMatch("aafa", pattern)); 
     //Assert.True(Regex.IsMatch("aafa", pattern)); 
     //Assert.True(Regex.IsMatch("aa,fa", pattern)); 
     //Assert.True(Regex.IsMatch("aafa", pattern)); 

     //Assert.False(Regex.IsMatch("aa<fa", pattern)); 
     //Assert.False(Regex.IsMatch("aaf>a", pattern)); 
     //Assert.False(Regex.IsMatch("aaf*a", pattern)); 
     //Assert.False(Regex.IsMatch("aafa*", pattern)); 
     //Assert.False(Regex.IsMatch("aaf%a", pattern)); 
     //Assert.False(Regex.IsMatch("aaf&a", pattern)); 
     //Assert.False(Regex.IsMatch("aaf:a", pattern)); 
     //Assert.False(Regex.IsMatch("aaf\a", pattern)); 
     //Assert.False(Regex.IsMatch("aaf?a", pattern)); 

    } 
+1

Угадывает, какой из этих случаев он терпит неудачу для части игры? Если нет, возможно, вы могли бы рассказать нам. –

+0

Guessing не входит в игру. Однако, когда я настраиваю выражение, оно начинает терпеть неудачу на одном из этих тестов. Позвольте мне обновить свой вопрос с помощью тестовых примеров, которые я использовал. – firefly

ответ

1

Это не должно быть просто

^[^<>*%&:\\\?]+$ 

или

^[^<>*%&:\\\?]*$ 

если пустая строка действительна

Или с автоматизацией, если invalid содержит RequestPathInvalidCharacters

var regex = new Regex(string.Format("^[^{0}]*$", 
            Regex.Escape(string.Join("",invalid.Split(','))))); 
+0

Это то, о чем я и думал сначала ... но этот тест не удался. var pattern = @ "^ [^ <> *% &: \\\?] + $"; Assert.False (Regex.IsMatch ("aaf \ a", pattern)); – firefly

+0

@firefly, строка, в которой выполняется синтаксический анализ, не содержит \ it содержит \ a, который является специальным символом. Попробуйте 'Assert.IsFalse (Regex.IsMatch (@" aa \ a ", pattern))' –

+0

А это позаботилось об этом. Спасибо. – firefly

2

Вы ожидали "aaf\a" провалить матч, но это не так \a является Экранированный символ «а». Таким образом, регулярное выражение соответствует строке, так как разрешен «a». Я подозреваю, что вы ожидали его сбой, если строка содержит обратную косую черту \. В этом случае измените строку выборки и обратный слеш, или использовать дословный строку:

Regex.IsMatch("aaf\\a", pattern) // escaped 
Regex.IsMatch(@"aaf\a", pattern) // verbatim string 

С учетом этого изменения в месте, @"^[^<>*%&:\\\?]+$" шаблон будет работать, и ваше утверждение должно пройти.

Что касается вашего негативного шаблона, то он принимает больше, чем нужно, поскольку он утверждает, возможно ли совпадение, но на самом деле не потребляет какой-либо текст, поэтому он дает положительные совпадения, если это не то, что предназначено. Чтобы исправить это поведение, добавьте что-то в шаблон, чтобы фактически совместить (и потреблять) текст.

// added ".+" before the final "$" 
var pattern = @"^(?!.*(" + inner + ").*).+$"; 
+0

Это лучший ответ. Но так как Боб ответил прежде, чем вы это сделали (и также верно, хотя гораздо меньше деталей), я отметил его как принятый. Итак, оказалось, что я писал плохие тестовые примеры ... У меня было правильное выражение (до того, как я начал настраивать) и отклонил неправильный путь. Еще раз спасибо за подробное объяснение. – firefly

Смежные вопросы