Как сделать?
…
Да не, мне в целом не важно какой синтаксис, лишь бы он был ясным и всё работало.
Если процедура сложная и выполняется хотя бы дважды — я сразу пишу функцию, чтобы больше с этим моментом не париться :)
Nex:
Конструкции для инкремента/декремента вида i++, i–, i++5 отсутствуют по идеологическим причинам?
Учитывая, что простота языка является одной из основных фишек QSP, можно и так сказать.
Сокращенные операции с присвоением
Хитрый Пряник,
ты это имел в виду?
ага. Просто мне знакомы другие языки и наличие таких операций привычно.
Сижу я такой, пишу, значит, апгрейд к своему склонятору, вычищаю код, пишу цикл и не работает. Искал-искал, нашёл. Не работает адекватно регэксп:
: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 "текст"