Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

упрощенный RegexKitLite - Objective-C

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Objective-C Определение района города http://www.cyberforum.ru/objective-c/thread847332.html
Приветос всем, я вот определил точный адрес в городе и тп с помощью CLGeocoder, кто шарит, как определить название района города? (например центральный и т.п.) в гугл мап на сайте определяет район...
Objective-C Учебник Посоветуйте какую-нибудь книгу (или сайт, ну вообщем инф.) по работе с базой данных SQL? http://www.cyberforum.ru/objective-c/thread844779.html
Положение кнопки Objective-C
В зависимости от положения кнопки у меня должны выполняться различные функции от нажания кнопки. Т.е. если кнопка в одном положении, то выполнится одно действие, если в другом, то другое. Я...
Иерархия StoryBoard Objective-C
Вопрос простой. В родовой View я создаю еще какой-нибудь контейнер, пусть будет Scroll View. Далее я хочу создать какую-нибудь кнопку, которая будет находиться как бы НАД scroll view, но...
Objective-C Visible http://www.cyberforum.ru/objective-c/thread844372.html
Я новичок, по этому прошу относиться с пониманием. Нужно сделать так, что бы контейнер по нажатии кнопки был активным илм не активным. (в других ЯП определяется пременной visible, по нужна не...
Objective-C классы, экземпляры, протоколы, и.т.п Здравствуйте, хочу поподробней почитать про классы, экземпляры, протоколы, и.т.п , где есть доступная информация на понятном языке ? ссылку плз ) подробнее

Показать сообщение отдельно
alexpac26
14 / 22 / 0
Регистрация: 20.01.2013
Сообщений: 125
27.04.2013, 11:11  [ТС]
Цитата Сообщение от Vorona Посмотреть сообщение
http://developer.apple.com/library/i...09708-CH1-SW48
такого например

в данном случае отдам предпочтение нативным методам работы с регулярными выражениями, нежели какому-то неясному phpRegexKitLite, который свалится в самом неподходящем месте или окажется, что в нем чего-то нет в самый ответственный момент, как это часто бывает с самодельными пятиколесными велосипедами
при чем тут вообще приставка php?? на objective-c вроде пишем..
интерпретация стандартных методов

SimpleRegex.h
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#import <Foundation/Foundation.h>
 
/*
 
 
 NSRegularExpressionCaseInsensitive             i
 NSRegularExpressionAllowCommentsAndWhitespace  c
 NSRegularExpressionIgnoreMetacharacters        m
 NSRegularExpressionDotMatchesLineSeparators    s
 NSRegularExpressionAnchorsMatchLines           l
 NSRegularExpressionUseUnixLineSeparators       x
 NSRegularExpressionUseUnicodeWordBoundaries    u
 
 // [url]http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40009708-CH1-SW48[/url]
 
 
 */
 
 
#ifndef SimpleRegex_class
#define SimpleRegex_class
 
static NSRegularExpressionOptions p_option_extract(NSMutableString* pattern);
static NSString * p_match(NSString * pattern, NSString* subject);
static NSMutableArray * p_match_all(NSString * pattern, NSString* subject);
static NSString * p_replace(NSString* pattern ,NSString* replacement ,NSString* subject);
 
 
 
static NSRegularExpressionOptions p_option_extract(NSMutableString* pattern) {
    NSString *s1 = [pattern substringToIndex:1];
    if ([s1 isEqualToString:@"#"]) {
        // обнаружены флаги
        for (int z=pattern.length-1; z>=1; z--) {
            if ([[pattern substringWithRange:NSMakeRange(z, 1)] isEqualToString:s1]) {
                // обнаружено
                // разбор флагов
                NSRegularExpressionOptions ret = 0;
                NSString *flags = [pattern substringWithRange:NSMakeRange(z+1, pattern.length-z-1)];
                for (int i=0; i<flags.length; i++) {
                    NSString *f = [flags substringWithRange:NSMakeRange(i, 1)];
                    if ([f isEqualToString:@"i"]) {
                        ret = (ret | NSRegularExpressionCaseInsensitive);
                        continue;
                    }
                    if ([f isEqualToString:@"s"]) {
                        ret = (ret | NSRegularExpressionDotMatchesLineSeparators);
                        continue;
                    }
                    if ([f isEqualToString:@"l"]) {
                        ret = (ret | NSRegularExpressionAnchorsMatchLines);
                        continue;
                    }
                    if ([f isEqualToString:@"u"]) {
                        ret = (ret | NSRegularExpressionUseUnicodeWordBoundaries);
                        continue;
                    }
                    if ([f isEqualToString:@"x"]) {
                        ret = (ret | NSRegularExpressionUseUnixLineSeparators);
                        continue;
                    }
                    if ([f isEqualToString:@"c"]) {
                        ret = (ret | NSRegularExpressionAllowCommentsAndWhitespace);
                        continue;
                    }
                    if ([f isEqualToString:@"m"]) {
                        ret = (ret | NSRegularExpressionIgnoreMetacharacters);
                        continue;
                    }
                }
                // сохраняем выражение
                [pattern setString:[pattern substringWithRange:NSMakeRange(1, z-1)]];
                return ret;
            } // end if
        } // end for
    } // end if
    return 0;
}
 
static NSString * p_match(NSString * pattern, NSString* subject) {
    NSMutableString *pattern_ok = [NSMutableString stringWithString:pattern];
    NSRegularExpressionOptions opt = p_option_extract(pattern_ok);
 
    NSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:pattern_ok options:opt error:NULL];
    NSTextCheckingResult *res = [reg firstMatchInString:subject options:NSMatchingReportProgress range:NSMakeRange(0, subject.length)];
    
    if (res.range.length==0) {
        return nil;
    } else {
        return [subject substringWithRange:res.range];
    }
    
}
 
//- (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))
 
 
 
static NSMutableArray * p_match_all(NSString * pattern, NSString* subject) {
    NSMutableString *pattern_ok = [NSMutableString stringWithString:pattern];
    NSRegularExpressionOptions opt = p_option_extract(pattern_ok);
    
    NSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:pattern_ok options:opt error:NULL];
    NSArray *res = [reg matchesInString:subject options:NSMatchingReportProgress range:NSMakeRange(0, subject.length)];
                    //NSMatchingReportProgress range:NSMakeRange(0, subject.length)];
    NSMutableArray *res2 = [NSMutableArray new];
    
    for (id obj in res) {
        [res2 addObject: [subject substringWithRange:[obj range]]]; 
    }
    
    return res2;
}
 
static NSString * p_replace(NSString* pattern ,NSString* replacement ,NSString* subject) {
    NSMutableString *pattern_ok = [NSMutableString stringWithString:pattern];
    NSRegularExpressionOptions opt = p_option_extract(pattern_ok);
    
    NSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:pattern_ok options:opt error:NULL];
 
    return [reg stringByReplacingMatchesInString:subject options:NSMatchingReportProgress range:NSMakeRange(0, subject.length) withTemplate:replacement];
}
 
#endif
и сразу подводные камни

1) – matchesInString:options:range:
возвращает не двухмерный массив в случае если надо найти подвыражения, а одномерный

<a>(.+?)</a>

=> потеря в функционале

2) аналога preg_split там нету

в остальном вроде вполне нормально (:
0
Вложения
Тип файла: zip test_regex.zip (193.0 Кб, 6 просмотров)
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru