Проблема с регулярным выражением в программе IOS

Я пытаюсь заставить следующее регулярное выражение работать на ios, чтобы убедиться, что пользователь вводит только числа и точку. Я не могу получить количество совпадений, превышающее 0. Я также пробовал NSRange one, и это даст мне 0, несмотря ни на что, поэтому мое регулярное выражение не работает, даже если я уверен, что он должен с что у меня там есть. Какие-либо предложения.

Код, который я написал, здесь с errorRegex определен в файле .h, и regError также определен.

errorRegex = [NSRegularExpression regularExpressionWithPattern:@"[^0-9.]*" 
            options: NSRegularExpressionCaseInsensitive error:&regError];

NSUInteger rangeOfFirstMatch = [errorRegex numberOfMatchesInString:servAmount1TF.text 
            options:0 range:NSMakeRange(0, [servAmount1TF.text length])];

person Rob    schedule 04.06.2012    source источник
comment
Меня озадачивает ваше регулярное выражение @"\\b[^0-9^.]*\\b", в частности, вторая вставка. Вы хотите, чтобы класс символов соответствовал чему-либо, кроме цифр или десятичной точки? Если так, то я думаю, вы хотите @"\\b[^0-9.]*\\b".   -  person David Gorsline    schedule 04.06.2012
comment
Да, это избыточный ^, который все еще работал на веб-сайте rubular, поэтому я не думаю, что это вызывает фактическую ошибку   -  person Rob    schedule 04.06.2012


Ответы (3)


Почему бы не использовать стандартный c regex.h?

См. Пример здесь: http://cboard.cprogramming.com/c-programming/117525-regex-h-extracting-matches.html.

И дополнительная информация здесь: https://stackoverflow.com/a/422159/1208218

person Roel Van de Paar    schedule 30.06.2012
comment
Это интересный маршрут. Я выбираю путь NS из-за iphone. Но я чувствую, что в конечном итоге это будет лучший маршрут, поскольку я имею в виду, что c работает с objective-c, так что спасибо. - person Rob; 02.07.2012
comment
Приятно слышать, что это было полезно. Я предполагаю, что можно было бы сделать больше вещей, используя стандартные функции c. - person Roel Van de Paar; 13.07.2012

errorRegex относится к типу NSRegularExpression, но ошибка имеет тип UIButtonContent. Это все признаки ошибки памяти. Что-то в вашем коде не проходит через правильный цикл сохранения / выпуска.


У меня есть модульный тест для работы с выражением @ "[^ 0-9.] +"

- (void)testRE
{
    NSError *regError = nil;
    NSRegularExpression *errorRegex;
    NSString *string;
    NSUInteger count;

    errorRegex = [NSRegularExpression regularExpressionWithPattern:@"[^0-9.]+" 
                                                           options: NSRegularExpressionCaseInsensitive
                                                             error:&regError];
    STAssertNil(regError, nil);

    string = @"00.0";
    count = [errorRegex numberOfMatchesInString:string 
                                        options:0
                                          range:NSMakeRange(0, [string length])];
    STAssertEquals(count, 0U, nil);

    string = @"00A00";
    count = [errorRegex numberOfMatchesInString:string 
                                        options:0
                                          range:NSMakeRange(0, [string length])];
    STAssertEquals(count, 1U, nil);
}
person Jeffery Thomas    schedule 04.06.2012
comment
Я исправил часть, которую вы прокомментировали, но забыл обновить сообщение. Я поместил всю работу с регулярным выражением в один и тот же метод вместо того, чтобы регулярное выражение работало глобально в файле .c - person Rob; 04.06.2012
comment
Я попробую это завтра и вернусь к вам. Спасибо - person Rob; 05.06.2012
comment
Спасибо. Я добавил свой ответ из-за объяснения и того, что представляет собой регулярное выражение, поэтому, если это понадобится другим, у них будет формула. - person Rob; 27.06.2012

NSRegularExpression *errorCheckRegEx = [[NSRegularExpression alloc] initWithPattern:@"\\b^([0-9]+(\\.)?[0-9]*)$|^([0-9]*(\\.)?[0-9]+)$|^[0-9]*$|^([0-9]*(\\/)?[0-9]*)$\\b" options:NSRegularExpressionCaseInsensitive error:nil];
[match setArray: [errorCheckRegEx matchesInString:servAmount1TF.text options:0 range:NSMakeRange(0, [servAmount1TF.text length])]];

Я понял, что мне нужно сделать, когда я наконец смогу вернуться к этому, поэтому, если кому-то было интересно, это то, что я придумал. \ B - это именно то, что ios использует в своем регулярном выражении, что отчасти глупо, но без этого он не будет работать, поэтому я оставляю его там, когда это не кажется естественным, особенно после примера с рубином. Это регулярное выражение получит дроби, десятичные дроби -> .3; 2.3; 2; и делает это от начала до конца строки. Я думаю, что могло произойти то, что я не использовал \ b, а также неправильно соответствовал, что является второй строкой. В любом случае сейчас он отлично работает. Спасибо за помощь.

person Rob    schedule 27.06.2012