Как избежать ввода дефиса в текстовое поле с помощью регулярных выражений?

У меня есть текстовое поле, в котором я выполняю проверки с использованием регулярных выражений. Но у меня есть проблема, когда пользователь вводит дефис в текстовое поле и нажимает кнопку, после чего должно быть выдано предупреждение о том, что ввод недействителен. Я выполняю проверки для строки и специальных символов, но для специальных символов проверка не выполняется.

Это мой код:

NSRegularExpression *regex = [[[NSRegularExpression alloc]
                                               initWithPattern:@"[a-zA-Z][#$%&*()']" options:0 error:NULL] autorelease];

person Rani    schedule 12.04.2012    source источник


Ответы (3)


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

NSRange k = [str rangeOfString:@"-"];
if(k.length != 0)
  ... Show your alert message

Я чувствую, что это удовлетворит ваши требования, не нужно усложнять, если регулярное выражение..

person DivineDesert    schedule 12.04.2012

Я не очень хорошо знаком с target-c и его разновидностью регулярных выражений, и я не полностью понимаю, о чем вы спрашиваете, но ваше регулярное выражение не будет соответствовать дефису. Он должен соответствовать букве, за которой следует один из следующих символов: #$%&*()'. Ниже приведены несколько примеров того, что должно совпадать, и некоторых вещей, которые не должны совпадать:

SHOULD MATCH              SHOULD NOT MATCH
----    ----            ----  ------  ------
 a#      a$              A     --      C3PO
 A)      A*              #     -       huh?
 T%      Q#              g-    AA##    123
 j&      a(              $R    ()      bbb5
 z'      B&              qq    "D%"    ()-

Если какой-либо из них не соответствует тому, что вы хотите сопоставить, вам нужно задать вопрос, содержащий желаемый шаблон, который вы хотите сопоставить. Некоторые примеры:

  • "любое количество букв, скобок, звездочек, амперсандов"
  • "любое количество любых символов, кроме дефисов и квадратных скобок ([])"
  • «от одной до трех заглавных букв, за которыми следует необязательное число»
  • ...или то, что соответствует вашим требованиям.

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

person Code Jockey    schedule 12.04.2012

Не показывать предупреждение, потому что пользователь ввел символ, который вам не нравится. Это ужасный UX, особенно при использовании программной клавиатуры, где опечатки более вероятны.

Вместо этого обработайте ввод, чтобы извлечь нужные символы. Подумайте о написании веб-формы с полем ввода для номера телефона. Вас не интересует удобочитаемое форматирование телефонного номера — дефисы, префикс «плюс» перед кодом страны и т. д. Но ничто не должно мешать пользователю вводить эти символы. У вас есть код, который может удалить недопустимые символы, оставив то, что вы хотите.

NSString даже упрощает это с -stringByTrimmingCharactersInSet:. Вы определяете NSCharacterSet с символами, которые вы хотите удалить из данного экземпляра NSString, вызываете -stringByTrimmingCharactersInSet:, и вы получаете автоматически выпущенный экземпляр NSString только с теми символами, которые вам нужны, например:

NSString          *rawInput; // value assigned elsewhere to @"555-555-1212"
NSCharacterSet    *characterSet = [ NSCharacterSet characterSetWithCharactersInString: @"-" ];
NSString          *processedInput = nil;

processedInput = [ rawInput stringByTrimmingCharactersInSet: characterSet ];

NSLog( @"processedInput: %@", processedInput ); // logs "5555551212"
person more tension    schedule 12.04.2012