Автор | Сообщение |
|
| |
Пост N: 23
Зарегистрирован: 06.12.14
|
|
Отправлено: 11.10.20 16:20. Заголовок: Есть ли аналог функций?
интересует аналог для функций AFTERATNUM() и BEFORATNUM() смысл такой же только поиск с конца строки. может кому попадалось? хочется оптимизированную замену конструкции в духе pos=rat(in,str) if pos>0 str=left(str,pos-1) // befor rat str=substr(str, pos+len(in)) // after rat endif вроде простые вещи и даже с начала строки есть реализация одной функцией, а чтобы с конца почему то не нашел ничего или может кто нибудь хорошо понимает внутренности харбора и подкрутить делов на 5 минут... в харборе они тут harbour-core/contrib/hbct/atnum.c
|
|
|
Ответов - 9
[только новые]
|
|
|
| Администратор
|
Пост N: 3982
Зарегистрирован: 23.05.05
|
|
Отправлено: 12.10.20 09:13. Заголовок: Так эти функции как ..
Так эти функции как раз выполняют поиск последнего вхождения, если не задан 3-й параметр: nCounter, т.е. работают как rat()
|
|
|
|
| |
Пост N: 24
Зарегистрирован: 06.12.14
|
|
Отправлено: 12.10.20 14:36. Заголовок: согласен пример не с..
согласен пример не совсем удачный привел да там есть такое и оно работает, но не в том случае когда надо выкусить на вхождении дальше 1 сама суть указанных функций, что можно игнорить нужное число вхождений, слева это работает справа нет, в итоге когда принципиально отрабатывать с конца, приходится кучу кода лепить, хотя сама операция вроде как простая и есть реализованный вариант слева направо. получается либо надо последовательно грызть кусками строку пока нужное число вхождений не наберется или считать все вхождения и выцеплять нужное описанными функциями или функциями из серии token разбирать собирать - все какое то многопроходное/ресурсоемкое
|
|
|
|
| Администратор
|
Пост N: 3983
Зарегистрирован: 23.05.05
|
|
Отправлено: 12.10.20 15:18. Заголовок: Это функции из ct. и..
Это функции из ct. и, поскольку главная цель харбора - обеспечить совместимость с клиппером, их поведение такое же, как в клиппер-тулз. Если конечно какие-то несовместимости еще не выявлены, но это вряд ли, учитывая солидный возраст харбора, уже 20 лет как никак. По этой причине менять функциональность этих функций не будут Надо делать свои аналоги. Что касается исходного поста, то можно сделать по другому, там оператор str=left(str,pos-1) наверное не нужен: pos=rat(in,str) if pos>0 str=substr(str, pos+len(in)) endif можно конечно сделать реализацию на C, но особого смысла в этом нет
|
|
|
|
| Администратор
|
Пост N: 3984
Зарегистрирован: 23.05.05
|
|
Отправлено: 12.10.20 16:20. Заголовок: В конце концов, можн..
В конце концов, можно получить число вхождений подстроки функцией NumAt. Затем, исходя из числа вхождений, прямо задавать 3-й параметр функции AfterAtNum Конечно, это не очень оптимально, но альтернатива - самому ползать по строке и выбирать что надо
|
|
|
|
| |
Пост N: 25
Зарегистрирован: 06.12.14
|
|
Отправлено: 12.10.20 20:36. Заголовок: Pasha пишет: Что ка..
Pasha пишет: цитата: | Что касается исходного поста, то можно сделать по другому, там оператор str=left(str,pos-1) наверное не нужен: pos=rat(in,str) if pos>0 str=substr(str, pos+len(in)) endif |
| ну там 2 варианта собственно для 2=х функций указаны просто сквозняком AFTERATNUM() и BEFORATNUM()
|
|
|
|
| |
Пост N: 26
Зарегистрирован: 06.12.14
|
|
Отправлено: 12.10.20 20:37. Заголовок: Pasha пишет: В конц..
Pasha пишет: цитата: | В конце концов, можно получить число вхождений подстроки функцией NumAt. Затем, исходя из числа вхождений, прямо задавать 3-й параметр функции AfterAtNum |
| в том то и дело что 2 прохода будет нерационально
|
|
|
|
| |
Пост N: 27
Зарегистрирован: 06.12.14
|
|
Отправлено: 12.10.20 20:50. Заголовок: вобщем сделал себе п..
вобщем сделал себе пока rat с номером вхождения, с отрезанием тоже сделал, но оно вдет себя аномально, не заходят внутренности нормально может где есть описание встроенных сишных функций?
|
|
|
|
| постоянный участник
|
Пост N: 1583
Зарегистрирован: 09.10.06
|
|
Отправлено: 12.10.20 22:27. Заголовок: Кроме функции RAt( ..
Кроме функции RAt( <cSearch>, <cString> ) --> nPos существует еще hb_RAt( <cSearch>, <cString>, [<nStart>], [<nEnd>] ) --> nPos This function searches for last occurrence a <cSearch> in <cString>. If the function is unable to find any occurrence of <cSearch> in <cString>, the return value is 0. 3rd and 4th parameters define inclusive range for 2nd parameter on which operation is performed. If 3rd and 4th parameters is not specified, then hb_RAt() is equal to RAt().
|
|
|
|
| |
Пост N: 28
Зарегистрирован: 06.12.14
|
|
Отправлено: 13.10.20 19:09. Заголовок: Петр пишет: hb_RAt(..
Петр пишет: цитата: | hb_RAt( <cSearch>, <cString>, [<nStart>], [<nEnd>] ) --> nPos |
| это позволяет указать с и по какую позицию в строке искать вхождение и не имеет никакого отношения к поиску X вхождения, смысл этого мне непонятен, но так работает в любом случае вопрос снимается, я его для себя уже решил
|
|
|
|