RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2435242 views

Хитрый Пряник #1300 20.12.2014 18:29 (11 years ago)

ага. Просто мне знакомы другие языки и наличие таких операций привычно.

Хитрый Пряник #1300 21.12.2014 02:13 (11 years ago)

Сижу я такой, пишу, значит, апгрейд к своему склонятору, вычищаю код, пишу цикл и не работает. Искал-искал, нашёл. Не работает адекватно регэксп:

:loop
*nl $strfind('один два три','\S+',i)
if i<2:i=i+1 & jump 'loop'

Здесь же три подстроки соответствуют, а он видит только первое вхождение.
Если задать суб-условие со скобками — его видит как второе вхождение (первого слова).

Задача — раскидать строку на отдельные слова.
Уже нашёл, что можно делать $strfind(’один два три’,’^(\S+)\s(\S+)\s(\S+)$’,i+1).
Это годится для случая, когда количество слов в строке известно.
А когда неизвестно или 322? Мне 322 скобки лепить?

Вот тут гляньте, как работают регэкспы

! Разбиваем строку с пробелами на слова с помощью регулярного выражения.
i = 0
:loop
$word = $STRFIND('один два три', '(((\b\w+\b)(\s*)){<<i>>})((\b\w+\b)(\s*))', 6)
IF $word <> '':
    i = i + 1
    *PL '<<i>>: ' + $word
    JUMP 'loop'
END

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

Хитрый Пряник #1300 21.12.2014 03:58 (11 years ago)

Nex, спасибо конечно. Но мде… Вот это костыль вместо \S+
В общем те самые 322 скобочки, только указанные через i
Знак больше-меньше это типа не-равно? Уже сталкивался с ним

Хитрый Пряник #1300 21.12.2014 05:04 (11 years ago)

А зачем выставлять \b (границу слова), если у тебя и так всё прочее отрезано скобкой заведомо?

Со своим разобрался, будет так:

$strfind('Один два-д.ва три','(\S+\s+){<<i>>}(\S+)',2)

Ищет группы символов, разделённые пробелами, в начале и конце пробелы недопустимы, а вот между словами можно лишний оставить

В общем те самые 322 скобочки, только указанные через i

Нет. Мой код универсален для любого количества слов.

Хитрый Пряник #1300 21.12.2014 15:13 (11 years ago)

а функция replace не умеет в регулярные выражения? Или умеет, но нужно регэксп не текстом указывать?
Я понимаю, что код ниже будет искать текст ‘^\S’

$word=replace($word,'^\S',ucase (strfind($word,'^\S')))

Или пользоваться только strfind?

$result[2]=ucase (strfind($result[2],'^\S'))+strfind($result[2],'^\S(\S+)',1)

Хитрый Пряник,
не умеет.

Хитрый Пряник #1300 21.12.2014 15:24 (11 years ago)

охо-хо. Это ж для сложных условий, типа «замени 3—5 вхождение символа» нужно цикл + полное представление строки регэкспом.

Ну да ладно, я понимаю, что тут мало кто регэкспы вообще трогает.

Программист Вася столкнулся с проблемой.
“Да её же можно решить с помощью регулярных выражений!” - понял Вася.
Теперь у Васи две проблемы.

Хитрый Пряник #1300 22.12.2014 03:33 (11 years ago)

Да, да, эту шуточку знаю :) Но они и правда хороши гибкостью и компактностью. Как ты мог заметить по моей упорной работе напильником по склонятору, я это очень ценю.

Не люблю играть в склоняторы. Текстовые игры мне больше по душе.

Хитрый Пряник #1300 22.12.2014 12:51 (11 years ago)

Ну я ж не про внешность, а про код. К тому же игра и складывается из всяких проработанных мелочей. Кстати о чистоте кода вопрос. Это заметно и ощутимо на мобильных устройствах? Имею в виду разницу между 20 грамотными строчками, выполняющими несколько циклов и 100 строчками делающими то же самое через кучу if, да всяких костылей?

Или, например, аппаратно есть ли разница между выражением типа:

*p "текст…"+str(переменная)+"текст"+str(переменная)+str(переменная)+'текст'

и

*p "текст…"
*p переменная
*p "текст"
*p переменная
*p переменная
*p "текст"

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

Как правило, нет.

о чистоте кода вопрос. Это заметно и ощутимо на мобильных устройствах? Имею в виду разницу между 20 грамотными строчками, выполняющими несколько циклов и 100 строчками делающими то же самое через кучу if, да всяких костылей?

Разницы нет. Описание локации выводится только по завершению обработки всего кода локации. Исключение может составлять лишь принудительный вызов REFINT, но им никто не пользуется.

По быстродействию: библиотека написана на чистом C и глубоко оптимизирована. Так что быстродействие обработки кода максимально.

Хитрый Пряник #1300 23.12.2014 16:56 (11 years ago)

Понял, спасибо. Это очень хорошо, что си и оптимизация.
Значит качество кода — это в основном для себя и коллег, читающих код или пользующихся методами, а для пользователя лишь бы правильно (по логике) работало.

Для себя, я уже понял, стоит, ибо хорошую процедуру/шаблон написал — ей потом просто пользоваться, экономит время.

Log in or Register to post comments.