2014-01-09 2 views
2

У меня есть следующий фрагмент кода, в котором я проверяю имя для недопустимых символов, а false возвращается, как только пользователь вводит недопустимый символ (допустимые символы определены в регулярном выражении) ,Проверка строки ввода для недопустимого символа с использованием regex

Проблема: это работает нормально, если пользователь вводит недопустимый символ в конце строки, но если пользователь вводит какой-либо недопустимый символ между ItemName, т.е. перемещая курсор где-то в середине ItemName, тогда он разрешен для записи недопустимого символа, т.е. true возвращается, а false должен быть возвращен.

Какую ошибку я делаю при определении регулярного выражения? Или любая другая ошибка? Спасибо

bool validName = true; 
Regex regex = new Regex(@"[a-zA-Z0-9_-]+$"); 
if (regex.IsMatch(ItemName, 0) == false) validName = false; 
if (!validName) 
{ 
    return false; 
} 
else 
{ 
    return true; 
} 

Пожалуйста, дайте мне знать, если что-то неясно.

Редактировать: Я изменил свое регулярное выражение с (@ "[a-zA-Z0-9 _-] + $") на (@ "^ [a-zA-Z0-9 _-] * $"), и он сработал , Есть ли очевидная ошибка, которую я делаю, или это правильное решение?

+0

Ваше регулярное выражение выглядит хорошо для меня .. –

+0

Изменение '+' на '*' также позволит обрабатывать пустую строку, а при добавлении '^' при запуске теперь будет выполняться полная строка для этого шаблона или нет. – NeverHopeless

ответ

3

Вам нужен якорь в начале вашего регулярного выражения "^[a-zA-Z0-9_-]+$")

Ваш Regex будет столкнутся с недопустимым символом, затем начните пытаться снова сопоставить следующий символ (который преуспевает).

Вашего регулярное выражение, как проработанный пример:

ItemName ="abc!def"; 
Regex regex = new Regex(@"[a-zA-Z0-9_-]+$"); // Not modified 
var result = Regex.IsMatch(ItemName, 0); 

Первого регулярное выражение будет соответствовать как многим из вашего класса персонажа, как это возможно, потому что + жаден:

*--- Start of match. 
"abc!def" 
    ^--- Regex engine matched up to here. 

Следующая часть вашего шаблона якорь $ или конец строки (в этом контексте). Это не соответствует '!' поэтому Regex начинает снова пытаться сопоставить следующий символ.

Он снова берет, как многие из вашего класса персонажа, как это возможно:

 *--- Start of match 
"abc!def" 
     ^--- Regex engine here. 

Опять он проверяет следующий символ является ли конец строки (что это такое). Поэтому найдено совпадение ('def') и IsMatch возвращает true.

Добавив в начало якорь ^ (начало строки), вы прекратите это.

FYI, весь ваш метод может быть сокращен до:

Regex regex = new Regex(@"^[A-Z0-9_-]+$", RegexOptions.IgnoreCase); 
return regex.IsMatch(ItemName); 

Edit:

Или даже просто:

return Regex.IsMatch(ItemName, @"^[A-Z0-9_-]+$", RegexOptions.IgnoreCase); 
1

изменить регулярное выражение, что вы используете для

Regex regex = new Regex(@"[^.*?(?=[\^#%&$\*:<>\?/\{\|\}]).*$"); 

это проверит недопустимый символ в поле вашего

+0

Спасибо за помощь, но почему-то я вынужден перечислить только допустимые символы, или вы можете сказать, что я не хочу перечислять недопустимые символы. – Vicky

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