Schöck
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Функции работы со строками

DwgRuLispLib: Функции работы со строками

Ответ
Поиск в этой теме
Непрочитано 06.12.2007, 19:14 #1
DwgRuLispLib: Функции работы со строками
VVA
 
Инженер LISP
 
Минск
Регистрация: 11.05.2005
Сообщений: 6,834

Здесь немного "причесанные" в смысле коментариев и оформления функции, любезно предоставленные Сергеем Зуевым (ShaggyDoc)
Описание функций:

_dwgru-string-align - выравнивает строку string до указанной длины str_len символом sym слева или справа
(_dwgru-string-align "121" 20 "0" T) ;_Результат "00000000000000000121"
(_dwgru-string-align "121" 20 "0" NIL) ;_Результат "12100000000000000000"

dwgru-string-align-to-left - выравнивает строку string до длины str_len символом sym слева
(dwgru-string-align-to-left "123" 10 "0") ;_Результат "0000000123"

dwgru-string-align-to-right - выравнивает строку string до длины str_len символом sym справа
(dwgru-string-align-to-right "123" 10 "0");_Результат "1230000000"

_dwgru-string-some-part - возвращает левую или правуючасть переданной строки с указанным разделителем
(_dwgru-string-some-part " M1:=100" "=" T) ;_Результат " M1:"
(_dwgru-string-some-part " M1:=100" "=" NIL) ;_Результат "100"

dwgru-string-left-part - возврат левой половины строки до разделителя delim_char
(dwgru-string-left-part " M= M1:=100" "=") ;_Результат " М"

dwgru-string-right-part - возврат правой половины строки после разделителя
(dwgru-string-right-part " M= M1:=100" "=") ;_Результат "100"
dwgru-string-replace - Функция замены вхождений подстроки (old_substr) в исходную строку (string) на новые (new_substr).
Регистрозависимо
(dwgru-string-replace "Здесь были ВаВася и ВаВаВаня. Вася" "Ва" "Бу") ;_Результат "Здесь были БуБуся и БуБуБуня. Буся"

dwgru-string-to-list - Возврат списка подстрок строки str с разделителем delimiter
(dwgru-string-to-list "М:1=100" "=") ;_Результат ("М:1" "100")

Версия от 06.12.2007
Версия от 29.05.2012

Вложения
Тип файла: rar DwgRuLispLib-string.rar (5.3 Кб, 253 просмотров)

__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 31.05.2012 в 14:18. Причина: - 3 года в версии
Просмотров: 19215
 
Непрочитано 12.09.2008, 14:45
#2
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


еще одна программа, для работы со строками...
Код:
[Выделить все]
 (defun _dwgru-str->list (s)
                 ;|
***************************************************************************************
*
* Программа разделяет строку на список текстовых и цифровых составляющих.
* Запятая между цифрами, зменяется на точечный разделитель дробной части.
* 
**************************************************************************************
*
* Написал Елпанов Евгений       (ElpanovEvgeniy)
*
* дата создания (13/10/2007 a 11:42)
* написано во время конкурса на форуме:
* http://www.cadxp.com/XForum+viewthread-fid-101-tid-16943-page-2.html
***************************************************************************************
* Пример использования и результатов работы:
* (_dwgru-str->list "point.25.4cm.")           => ("point." 25.4 "cm.")
* (_dwgru-str->list "point.25,4cm.")           => ("point." 25.4 "cm.")
* (_dwgru-str->list "point.3/8cm.")            => ("point." 0.375 "cm.")
* (_dwgru-str->list "qvf12qsdf125 5sf 56dfv2") => ("qvf" 12 "qsdf" 125 " " 5 "sf " 56 "dfv" 2)
***************************************************************************************
 |;
 (defun str->list1 (a b f)
  (cond
   ((null b)
    (list (if f
           (cond ((vl-position 46 a) (atof (vl-list->string (reverse a))))
                 ((vl-position 47 a) (distof (vl-list->string (reverse a))))
                 ((vl-position 44 a) (atof (vl-list->string (subst 46 44 (reverse a)))))
                 (t (atoi (vl-list->string (reverse a))))
           ) ;_ cond
           (vl-list->string (reverse a))
          ) ;_ if
    ) ;_ list
   )
   (f
    (if (or (= (car b) 44) (< 45 (car b) 58))
     (str->list1 (cons (car b) a) (cdr b) f)
     (cons (cond ((vl-position 46 a) (atof (vl-list->string (reverse a))))
                 ((vl-position 47 a) (distof (vl-list->string (reverse a))))
                 ((vl-position 44 a) (atof (vl-list->string (subst 46 44 (reverse a)))))
                 (t (atoi (vl-list->string (reverse a))))
           ) ;_ cond
           (str->list1 (list (car b)) (cdr b) nil)
     ) ;_ cons
    ) ;_ if
   )
   (t
    (if (< 47 (car b) 58)
     (cons (vl-list->string (reverse a)) (str->list1 (list (car b)) (cdr b) t))
     (str->list1 (cons (car b) a) (cdr b) nil)
    ) ;_ if
   )
  ) ;_ cond
 ) ;_ defun
 (setq s (vl-string->list s))
 (str->list1 (list (car s))
             (cdr s)
             (if (or (= (car s) 44) (< 45 (car s) 58))
              t
             ) ;_ if
 )
)

Последний раз редактировалось Елпанов Евгений, 03.02.2011 в 15:41.
Елпанов Евгений вне форума  
 
Непрочитано 12.09.2008, 15:55
#3
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 773


Цитата:
Сообщение от VVA Посмотреть сообщение
dwgru-string-replace - Функция замены вхождений подстроки (old_substr) в исходную строку (string) на новые (new_substr).
Регистрозависимо
(dwgru-string-replace "Здесь были ВаВася и ВаВаВаня. Вася" "Ва" "Бу") ;_Результат "Здесь были БуБуся и БуБуБуня. Буся"
Добавлю один неочевидный момент - данная функция сначала проводит замену строк неперекрывющимся способом, т.е. обнаруженная старая строка исключается из дальнейшего поиска, а по достижении конца строки и после обратной сборки изменённой строки цикл поиска запускается вновь. В случае, если замена старой строки на новую может образовать новые вхождения старой строки, замена будет проведена повторно, с неочевидным резульатом.
Пример:
Код:
[Выделить все]
_$ (dwgru-string-replace "Проба ----замены подстроки" "--" "+-")
"Проба +-+-замены подстроки"
_$ (dwgru-string-replace "Проба -----замены подстроки" "--" "+-")
"Проба +-++-замены подстроки"
По логике работы эту функцию можно представить как набор двух функций одна из которых циклично вызывает другую.
Alaspher вне форума  
 
Непрочитано 26.04.2012, 16:52
#4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,683
Отправить сообщение для Do$ с помощью Skype™


Поделюсь своей библиотечной функцией, она сделана так, что в ней нет того, о чем говорится в #3.
Код:
[Выделить все]
 (defun _dwgru-string-substr-all (new-pat old-pat str / pos rez)
  ;|
(_dwgru-string-substr-all "::" ":" "ghh:rghhyhyh:rgrgthth::rggtht:")
|;
  (setq rez "")
  (while (/= str "")
    (if	(setq pos (vl-string-search old-pat str))
      (progn
	(setq rez (strcat rez (substr str 1 pos) new-pat)
	      str (substr str
			  (+ 1 (strlen old-pat) pos)
		  ) ;_ end of substr
	) ;_ end of setq
      ) ;_ end of progn
      (setq rez	(strcat rez str)
	    str	""
      ) ;_ end of setq
    ) ;_ end of if
  ) ;_ end of while
  rez
) ;_ end of defun
Do$ вне форума  
 
Непрочитано 28.05.2012, 11:27
#5
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Не знаю, может я не ту версию скачал?
VVA, скачал из вложений последнюю версию функций. По-моему, в функции _dwgru-string-align ошибка
Код:
[Выделить все]
 
_$ (_dwgru-string-align "1" 2 "0" nil)
"1" ; а должно быть "10"
$ (_dwgru-string-align "123" 4 "0" nil)
"123" ; а должно быть "1230"
В коде, в первой строке вместо знака ">" нужно поставить ">="
Код:
[Выделить все]
; сейчас
  (if (> (setq
           sym_count (- str_len (strlen string))
         ) ;_ end of setq
         1
      ) ;_ end of >
...
; нужно
  (if (>= (setq
           sym_count (- str_len (strlen string))
         ) ;_ end of setq
         1
      ) ;_ end of >=
...
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 29.05.2012, 11:00
#6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,834
<phrase 1= Отправить сообщение для VVA с помощью Skype™


TararykovDG, Спасибо. Перезалил архив
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 31.05.2012, 13:55
#7
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от VVA Посмотреть сообщение
Версия от 06.12.2007
Версия от 29.05.2015
VVA, с годом конечно же перебор
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 31.05.2012, 14:00
#8
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
VVA, с годом конечно же перебор
На мой взгляд, все нормально.
Следущая версия через три года...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 31.05.2012, 14:19
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,834
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Версия от 29.05.2015
Должно было быть так
Цитата:
Следующая версия будет от 29.05.2015
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Функции работы со строками

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск работы Perezz!! Разное 46 21.03.2008 12:50
функции для работы с ini-файлами ivspec Программирование 4 08.08.2006 11:43
Особенности работы функции TRANS kp+ Программирование 10 31.05.2006 00:55
Моделирование работы свай p_sh Основания и фундаменты 4 08.08.2005 14:41