Как сделать?
…
ага. Просто мне знакомы другие языки и наличие таких операций привычно.
Сижу я такой, пишу, значит, апгрейд к своему склонятору, вычищаю код, пишу цикл и не работает. Искал-искал, нашёл. Не работает адекватно регэксп:
: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
см.
Регулярные выражения
Самоучитель по регулярным выражениям
Nex, спасибо конечно. Но мде… Вот это костыль вместо \S+
В общем те самые 322 скобочки, только указанные через i
Знак больше-меньше это типа не-равно? Уже сталкивался с ним
А зачем выставлять \b (границу слова), если у тебя и так всё прочее отрезано скобкой заведомо?
Со своим разобрался, будет так:
$strfind('Один два-д.ва три','(\S+\s+){<<i>>}(\S+)',2)
Ищет группы символов, разделённые пробелами, в начале и конце пробелы недопустимы, а вот между словами можно лишний оставить
В общем те самые 322 скобочки, только указанные через i
Нет. Мой код универсален для любого количества слов.
а функция replace не умеет в регулярные выражения? Или умеет, но нужно регэксп не текстом указывать?
Я понимаю, что код ниже будет искать текст ‘^\S’
$word=replace($word,'^\S',ucase (strfind($word,'^\S')))
Или пользоваться только strfind?
$result[2]=ucase (strfind($result[2],'^\S'))+strfind($result[2],'^\S(\S+)',1)
Хитрый Пряник,
не умеет.
охо-хо. Это ж для сложных условий, типа «замени 3—5 вхождение символа» нужно цикл + полное представление строки регэкспом.
Ну да ладно, я понимаю, что тут мало кто регэкспы вообще трогает.
Программист Вася столкнулся с проблемой.
“Да её же можно решить с помощью регулярных выражений!” - понял Вася.
Теперь у Васи две проблемы.
Да, да, эту шуточку знаю :) Но они и правда хороши гибкостью и компактностью. Как ты мог заметить по моей упорной работе напильником по склонятору, я это очень ценю.
Не люблю играть в склоняторы. Текстовые игры мне больше по душе.
Ну я ж не про внешность, а про код. К тому же игра и складывается из всяких проработанных мелочей. Кстати о чистоте кода вопрос. Это заметно и ощутимо на мобильных устройствах? Имею в виду разницу между 20 грамотными строчками, выполняющими несколько циклов и 100 строчками делающими то же самое через кучу if, да всяких костылей?
Или, например, аппаратно есть ли разница между выражением типа:
*p "текст…"+str(переменная)+"текст"+str(переменная)+str(переменная)+'текст'
и
*p "текст…"
*p переменная
*p "текст"
*p переменная
*p переменная
*p "текст"
К тому же игра и складывается из всяких проработанных мелочей.
Как правило, нет.
о чистоте кода вопрос. Это заметно и ощутимо на мобильных устройствах? Имею в виду разницу между 20 грамотными строчками, выполняющими несколько циклов и 100 строчками делающими то же самое через кучу if, да всяких костылей?
Разницы нет. Описание локации выводится только по завершению обработки всего кода локации. Исключение может составлять лишь принудительный вызов REFINT, но им никто не пользуется.
По быстродействию: библиотека написана на чистом C и глубоко оптимизирована. Так что быстродействие обработки кода максимально.
Понял, спасибо. Это очень хорошо, что си и оптимизация.
Значит качество кода — это в основном для себя и коллег, читающих код или пользующихся методами, а для пользователя лишь бы правильно (по логике) работало.
Для себя, я уже понял, стоит, ибо хорошую процедуру/шаблон написал — ей потом просто пользоваться, экономит время.