Почему это регулярное выражение всегда возвращает NO? - PullRequest
1 голос
/ 25 апреля 2011

Я использую следующее регулярное выражение:

NSString *reg1 = @"/[$|§|%|&|{|}|'|`|´|^|°|~]/i";

NSPredicate *messageTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",
                           reg1];

И я проверяю, соответствует ли строка этому регулярному выражению:

if([messageTest evaluateWithObject:message] == NO){
        messageValid = NO;
        NSLog(@"message invalid");
}

Так что, если текст содержит какие-либо из указанных символов,в регулярном выражении текст недействителен.

Это регулярное выражение работает для меня в JavaScript.Однако в target-c я всегда получаю НЕТ, независимо от того, какие символы находятся в строке.

В чем проблема?

Ответы [ 2 ]

4 голосов
/ 25 апреля 2011

Существуют две проблемы с вашим кодом. Во-первых, ваше регулярное выражение

NSString *reg1 = @"/[$|§|%|&|{|}|'|`|´|^|°|~]/i";

неправильно:

  • Регулярные выражения ICU не используют / pattern / modifier. Кроме того, зачем указывать регистронезависимое соответствие для этого набора символов?
  • Регулярным выражениям ICU необходимо заключать в кавычки следующие символы: $ { } ^
  • Как упоминалось в ridgerunner, не используйте | для разделения символов в классе символов.

Требуемое регулярное выражение ICU:

[\$§%&\{\}'`´\^°~]

Попробуйте это в вашей программе:

NSString *reg1 = @"[\\$§%&\\{\\}'`´\\^°~]";

(обратите внимание, что символ \ представлен как \\ в строке Objective-C.)

Во-вторых, вы тестируете

if([messageTest evaluateWithObject:message] == NO)

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

if([messageTest evaluateWithObject:message])

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

1 голос
/ 25 апреля 2011
  • В классе символов не разделяйте символы с символом |.Класс символов может соответствовать только одному символу, а класс char - это просто список того, каким может быть этот символ.(См .: Классы символов )
  • Я не знаю цели C, но я предполагаю, что вам не нужны разделители /.Я думаю, что это, вероятно, ваша главная проблема.
  • Ваш вопрос не ясен.Вы хотите проверить, соответствует ли какой-либо из символов в строке, или вы хотите убедиться, что все символы в строке совпадают, или вы хотите увидеть, совпадают ли ни один из символов или что?

Тем не менее, попробуйте это, что исправляет пару проблем:

NSString *reg1 = @"[$§%&{}'`´^°~]";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...