Форум программистов, компьютерный форум, киберфорум
Objective-C
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
1

Использование регулярных выражений

03.05.2014, 19:01. Показов 2281. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Перемещено из Поиск в массиве

noname_club, а зачем вот это:
топик-стартер наверно имел ввиду поиск строки в текстовом файле.

как один из вариантов это поиск через регулярки.

синтаксис индентичен php выражениям
думаю вы не будет оспаривать тот факт что php синтаксис выражений , в частности перечисление флагов i,s,m в самом выражении, более читабелен нежели objc конструкции.

Добавлено через 3 минуты
[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
lines = [fileString componentsSeparatedByString:@"\n"];
это уже трансформация текста в массив.

вот мой массив,мне надо просто проверить на наличие в нем какого-то слова
Objective-C
1
2
3
4
5
6
7
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"word_base"
                                                         ofType:@"txt"];
NSString *fileString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
 
if (php_preg_match(@"слово", fileString )) {
   // слово найдено!
}
Добавлено через 10 минут
еще можно через предикаты
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
// мануалы по предикатам
/*
 [url]http://macbug.ru/cocoa/predformat#.URySNejoRGM[/url]
 [url]http://userguide.icu-project.org/strings/regexp[/url]
 */
 
#define pr_BEGINSWITH_IgnoreCase @"BEGINSWITH[cd]"
#define pr_ENDSWITH_IgnoreCase @"ENDSWITH[cd]"
#define pr_LIKE_IgnoreCase @"LIKE[cd]"
#define pr_CONTAINS_IgnoreCase @"CONTAINS[cd]"
#define pr_MATCHES_IgnoreCase @"MATCHES[cd]"
#define pr_EQUAL_IgnoreCase @"==[cd]"
 
#define pr_BEGINSWITH @"BEGINSWITH"
#define pr_ENDSWITH @"ENDSWITH"
#define pr_LIKE @"LIKE"
#define pr_CONTAINS @"CONTAINS"
#define pr_MATCHES @"MATCHES"
#define pr_EQUAL @"=="
 
bool string_predicate_match (NSString* string, NSString* predicate, NSString* predicateValue) {
// функция сравнения строк через выражения
    NSString *p1 = [NSString stringWithFormat:@"SELF %@ %%@",predicate];
    NSPredicate *regexp = nil;
    if (predicateValue) {
        regexp = [NSPredicate predicateWithFormat:p1,predicateValue];
    }
    return [regexp evaluateWithObject:string];
}
пример

Objective-C
1
2
3
4
5
6
7
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"word_base"
                                                         ofType:@"txt"];
NSString *fileString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
 
if ( string_predicate_match(fileString , pr_CONTAINS, @"слово" )) {
   // слово найдено!
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2014, 19:01
Ответы с готовыми решениями:

Использование регулярных выражений
Доброго времени суток, уважаемые форумчане! Подскажите пожалуйста. Уже мозг сломал. Есть массив...

Использование регулярных выражений
Добрый День! Имеется строка в виде <Symbol>GRX/SPB</Symbol>...

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

Использование регулярных выражений в GO
Регулярные выражения(RegEx) — система обработки текста, основанная на специальной системе записи...

11
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
03.05.2014, 20:51 2
Цитата Сообщение от noname_club Посмотреть сообщение
думаю вы не будет оспаривать тот факт что php синтаксис выражений , в частности перечисление флагов i,s,m в самом выражении, более читабелен нежели objc конструкции.
Ясное дело буду. Зачем мне php нотация в Objective-C коде... При этом еще и в виде функций, а не "хотя бы" категорий.
Или еще лучше:
#define pr_EQUAL @"=="
Вместо двух символов или пяти с ковычками и собакой использовать странные именования.

noname_club, знаете такой принцип бритвы Оккама?
0
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
04.05.2014, 12:43  [ТС] 3
Вместо двух символов или пяти с ковычками и собакой использовать странные именования.
вы не берете в рассчет подсказки IDE xcode

стоит набрать pr_ и открывается список предикатов которые можно применить.
Таким образом не нужно запоминать названия этих предикатов и как они пишутся. Достаточно набрать pr_

Зачем мне php нотация в Objective-C коде... При этом еще и в виде функций, а не "хотя бы" категорий.
не буду комментировать. Мне просто нравиться СИ синтаксис функций, особенно в том случае если они выполняют нечто важное.

Добавлено через 23 минуты
рассмотрим бритву оккама на примере предиката

Objective-C
1
2
3
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"word_base"
                                                         ofType:@"txt"];
NSString *fileString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
1) бритва Оккама с использование только Foundation.h

---A---

Вcпомнить название и правописание предиката CONTAINS

---B---

Включить CAPSLOCK или держать Shift для правильного написания предиката

---C---

Составить предикат

Objective-C
1
[NSPredicate predicateWithFormat:@"SELF CONTAINS %@", @"слово"]
---D---

составить условие

Objective-C
1
2
3
if ([[NSPredicate predicateWithFormat:@"SELF CONTAINS %@", @"слово"] evaluateWithObject: fileString]) {
 // слово найдено!
}
ИТОГ

A+B+C+D = результат

~~~~~~~~~~~~~~~~~~~

2) бритва Оккама с использованием %библитеки утилит общего назначения в которой есть функция string_predicate_match()%.h

---A---

Вспомнить что есть название фунции состоящее из string (строковая) + predicate(предикат) + match(соответствие)

---B---

Вспомнить что при наборе pr_ получаем список предикатов доступных для использования

---С---

Составить условие
Objective-C
1
2
3
if ( string_predicate_match(fileString , pr_CONTAINS, @"слово" )) {
   // слово найдено!
}
ИТОГ

A+B+C = результат
0
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
04.05.2014, 19:27 4
Цитата Сообщение от noname_club Посмотреть сообщение
не буду комментировать. Мне просто нравиться СИ синтаксис функций, особенно в том случае если они выполняют нечто важное.
Работал я с одним человеком, у которого на такие вещи были стандартные слова - "мне так нравится делать". Не любили его в команде, и удалили позже.
Так вот, если это вам нравится, но вы не думаете о тех людях, которые могут столкнуться с вашими творениями - это прискорбно.
Цитата Сообщение от noname_club Посмотреть сообщение
A+B+C = результат
Пропускаете то, что 99% из тех, кто программирует на Objective-C, и слышать не слышали о такой странности, как использовать наименования и обвязку функциональной частью "как в php" методов из Foundation Framework.
Еще пропускаете то, что придется запоминать совершенно ненужную прослойку в виде ваших "pr_ololo"
В итоге мы будем иметь одинаковый функционал, написанный несколько раз. И один раз будет в странном синтаксисе, который по стилю будет совершенно отличен от остального кода.

Имхо, вы как-то странно показали пример для выражения "не плодить сущности без необходимости"...
А ваша обвязка в данном контексте - именно такая сущность.
0
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
04.05.2014, 20:16  [ТС] 5
Не любили его в команде, и удалили позже.
В команде люди должны разговаривать друг с другом и чтобы использовать эти "библиотеки" нужно 2 вещи:

1) документация на "библиотеки", которая показывает сущность идеологии их использования.
2) желание их использовать

как использовать наименования и обвязку функциональной частью "как в php" методов из Foundation Framework.
тот кто программирует на OBJ-C должен был с чегото начинать. Это мог быть php это мог быть JavaScript, должен по крайней мере интересоваться.

Сам факт использования регулярных выражений это уже гарантия частичного знания JavaScript или PHP или Perl

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

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

мне так нравится делать
если нравится надо обосновать свою точку зрения. Может она понравиться и другим.

Имхо, вы как-то странно показали пример для выражения "не плодить сущности без необходимости"...
А ваша обвязка в данном контексте - именно такая сущность.
Когда сущность вызывается многократно. Возникает дублирование кода не?

Добавлено через 6 минут
Пропускаете то, что 99% из тех, кто программирует на Objective-C, и слышать не слышали о такой странности, как использовать наименования и обвязку функциональной частью "как в php" методов из Foundation Framework.
Еще пропускаете то, что придется запоминать совершенно ненужную прослойку в виде ваших "pr_ololo"
2)
в пунктах A и B как раз идет обращение мозга к тому что нужно вспомнить

1)
в пункте A тоже идет обращеник тому что нужно вспомнить

вопрос в том насколько быстро будет выполнет A1 по сравнению с A2 и B2

а что говорить про пункты C1 и D1 они в 2-3 раза медленее и напряжнее чем C2
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
04.05.2014, 20:19 6
А мне нравится писать весь код в одну строчку..
Цитата Сообщение от noname_club Посмотреть сообщение
если нравится надо обосновать свою точку зрения
Вы совершенно правы! Это же сколько экономии, не надо затем никаких обфускаторов и т.п., сжимающих код! Правда, C не особо-то это позволяет, поэтому я использую другие языки программирования. Но это же не беда?
0
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
04.05.2014, 20:25  [ТС] 7
просмотрим на это с другой стороны

Допустим есть задача:

Автоматизировать в среде разработки ввод предиката, да так чтобы она тебе подсказывала какой предикат можно применить, чтобы его самому не писать?

Так бы ты zulkis ее решил?

Добавлено через 2 минуты
Вы совершенно правы! Это же сколько экономии, не надо затем никаких обфускаторов и т.п., сжимающих код! Правда, C не особо-то это позволяет, поэтому я использую другие языки программирования. Но это же не беда?
Сарказм?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
04.05.2014, 20:31 8

Не по теме:

Цитата Сообщение от noname_club Посмотреть сообщение
Сарказм?
Не.. Скука)



Добавлено через 4 минуты
Цитата Сообщение от noname_club Посмотреть сообщение
так как научиться использовать регулярки можно только в скриптовых языках
не согласен. В большинстве ЯП используется один и тот же синтаксис - PCRE (Perl-совместимые регулярные выражения), а различия его синтаксиса в различных ЯП заключаются лишь в реализованных возможностях (да, встречаются еще и POSIX-совместимые регулярки, но это уже почти редкость). Например, в упомянутом выше JavaScript отсутствуют заглядывания назад, возможность проверки на начало/конец строки и т.п., а в PHP, Ruby и т.п. это реализовано. Ну и, возможно, небольшие отличия по синтаксису (хотя сама суть одна и та же - лишь незначительные различия в реализации).
На основании вышеизложенного можно смело сказать, что знание/незнание регулярных выражений не зависит от знания/незнания каких-либо скриптовых ЯП. Да и, к примеру, если почитаете книгу Фридла, то увидите, что он вообще начинает объяснять регулярки на примере "своего" языка..
2
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
06.05.2014, 06:57 9
Давно стараюсь игнорировать посты noname_club, но тут все-таки выскажу свое мнение.

У такого подхода плюсы я вижу такой: IDE подсказывает строчку. Все.

Минусы:
Главный минус: такая либа не нужна. Задача, которую вы пытаетесь решить, noname_club, такая мелкая и настолько частная, что использование чего-то стороннего здесь - это просто большой оверхед (опять же бритва Оккама). Средний разработчик за день сталкивается с десятками разных задач типа этой, и иметь для каждого подобного чиха специальную либу просто нерационально.
К тому же разработчик должен как минимум знать, что есть готовое решение для его проблемы, либо поискать его codebase, затем он должен его подключить (не исключено, что оно с подобным именованием наплодит конфликтов имен) и понять как с ним работать. Поздравляю, задачу которая решается стандартными средствами за 1 минуту, вы растянули в несколько раз, при этом добавили зависимостей и сделали код менее понятным для непосвященных.
По поводу php нотации скажу только, что аргумент "мне так нравится" может прокатить только для личных домашних проектов, но не для коммерческих и тем более командных. У меня в команде такой код даже ревью не прошел бы.
Если вам уж так хочется это сделать, то написали бы как-то так, получили бы намного меньше лучей поноса в свой адрес:
Objective-C
1
2
3
4
5
6
7
8
static NSString * const kNoNameClubAwesomeOverheadPredicateMatches = @"MATCHES";
...
 
@interface NSString (NoNameClubAwesomeOverheadPredicate)
 
- (BOOL)evaluatePredicate:(NSString *)predicate withValue:(NSString *)value;
 
@end
Ничего личного, никого не хочу обидеть, но у меня складывается впечатление, что вы, noname_club, никогда не работали в команде хотя бы из 3 - 5 разработчиков, где есть хотя бы пара опытных, и над более менее серьезными проектами, которые бы развивались и поддерживались хотя бы несколько месяцев, а также мало сталкивались с кодом других подобных "самоделкиных", который вам необходимо дорабатывать. Если у вас подобная ерундовая задача, чтобы решить ее быстро и эффективно, требует написания каких-то сторонних утилит, то это прискорбно. Вполне возможно, я ошибаюсь.
0
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
07.05.2014, 09:27  [ТС] 10
Переименуйте тему в "неправильное использование регулярных выражений и предикатов" ведь вы все так считаете!

подписка на тему анулирована.

Добавлено через 7 минут
У меня в команде такой код даже ревью не прошел бы.
Знал бы я ваши требования. Можно было бы найти выход. Неужели без сторонних библиотек работаете? так не бывает.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
07.05.2014, 09:28 11
Цитата Сообщение от noname_club Посмотреть сообщение
Переименуйте тему
а зачем, если, как вы сами говорите
Цитата Сообщение от noname_club Посмотреть сообщение
подписка на тему анулирована.
?
И да, вопрос не в правильном/неправильном использовании, а в уместности их применения в конкретной ситуации..

Не по теме:

а я так и вообще проездом, я на objective c и не писал ни разу)

0
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
07.05.2014, 11:00 12
Цитата Сообщение от noname_club Посмотреть сообщение
Знал бы я ваши требования. Можно было бы найти выход. Неужели без сторонних библиотек работаете? так не бывает.
Вы в мое сообщение хорошо читали?
Во-первых требования не "мои", по большей части у нас в команде руководствуются Apple Coding Guidelines for Cocoa, кроме некоторых нюансов, где у нас прописаны свои. Требования эти существуют для повышения эффективности разработки и поддержки кода, а не по чьей-то прихоти.
Во-вторых, я не писал, что мы не используем сторонних библиотек. Конечно используем, но только не для задач типа "сложить 2 и 2".
В-третьих, раз уж отвечаете на адресованное вам сообщение, потрудитесь не игнорировать его большую часть.

Цитата Сообщение от noname_club Посмотреть сообщение
Переименуйте тему в "неправильное использование регулярных выражений и предикатов" ведь вы все так считаете!
подписка на тему анулирована.
А это похоже на детскую обиду. Если предлагаете свои решения и выкладываете их в общий доступ, будьте готовы к аргументированной критике.
0
07.05.2014, 11:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2014, 11:00
Помогаю со студенческими работами здесь

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

Использование регулярных выражений в case
case "$Keypress" in ) echo "буква в нижнем регистре";; ) echo "Буква в верхнем...

Использование регулярных выражений, хранимых в массиве
Друзья, я столкнулся со странной для себя проблемой, которую попросту не понимаю. Есть массив...

Возможно ли такое использование регулярных выражений ?
Есть ArrayList из символов, наличие которых необходимо проверить в строке. Но, к примеру, если я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru