purebasic.info

PureBasic forum
Текущее время: Сб июн 23, 2018 12:50 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: ReplaceString и регистр символов
СообщениеДобавлено: Сб авг 15, 2015 7:43 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 624
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
ReplaceString игнорирует #PB_String_NoCase
РВ 530
И кто тут неправ?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Global  s.s, s1.s, s2.s, re1.s, re2.s
If OpenWindow(0, 0, 0, 400, 328, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
EditorGadget(1, 7, 7, 400-14, 100)
EditorGadget(2, 7, 100+14, 400-14, 100)
EditorGadget(3, 7, 200+21, 400-14, 100)
s="Список список СпИсОк список список"
SetGadgetText(1, s)
re1="список"
re2="List"
s1=ReplaceString(s, re1, re2, #PB_String_CaseSensitive)
SetGadgetText(2, s1)
s2=ReplaceString(s, re1, re2, #PB_String_NoCase)
SetGadgetText(3, s2)
 
Repeat
ev=WaitWindowEvent()
If GetAsyncKeyState_(#VK_ESCAPE)=-32767:Break:EndIf
Until ev = #PB_Event_CloseWindow
EndIf



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReplaceString и регистр символов
СообщениеДобавлено: Сб авг 15, 2015 8:04 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 230
Благодарил (а): 31 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
Подтверждаю на PB524-PB531
зы. Правильно отрабатывает только на комбинации исходник-UTF8, компилятор-не_Unicode но правда при этом вместо русских букв отображаются кракозябры, во всех других сочетаниях, NoCase - не срабатывает.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReplaceString и регистр символов
СообщениеДобавлено: Сб авг 15, 2015 8:12 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6313
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
newJS писал(а):
ReplaceString игнорирует #PB_String_NoCase
РВ 530
И кто тут неправ?

Буржуи неправы. С латиницей всё работает у них, а кириллицу дискриминируют.
Я поступаю так:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Global  s.s, s1.s, s2.s, re1.s, re2.s
If OpenWindow(0, 0, 0, 400, 328, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
EditorGadget(1, 7, 7, 400-14, 100)
EditorGadget(2, 7, 100+14, 400-14, 100)
EditorGadget(3, 7, 200+21, 400-14, 100)
s="Список список СпИсОк список список"
SetGadgetText(1, s)
re1="список"
re2="List"
s1=ReplaceString(s, re1, re2, #PB_String_CaseSensitive)
SetGadgetText(2, s1)
s2=ReplaceString(LCase(s), LCase(re1), re2, #PB_String_NoCase)
SetGadgetText(3, s2)
 
Repeat
ev=WaitWindowEvent()
If GetAsyncKeyState_(#VK_ESCAPE)=-32767:Break:EndIf
Until ev = #PB_Event_CloseWindow
EndIf
 


_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReplaceString и регистр символов
СообщениеДобавлено: Сб авг 15, 2015 9:42 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 880
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
регулярками заменяйте 8)

_________________
Детям нельзя в интернет. От детей интернет тупеет.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReplaceString и регистр символов
СообщениеДобавлено: Сб авг 15, 2015 11:37 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 624
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
Виталь, если строка в несколько сотен кил, то наверно будет тормозить?
Регулярка это первое что в голову пришло, просто решил убедиться.

А какие мысли по скорости, опускать строку или регулярка?, файлов много и попадаются большие.

А FindString правильно работает с регистром.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReplaceString и регистр символов
СообщениеДобавлено: Сб авг 15, 2015 2:13 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 880
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
newJS писал(а):
Виталь, если строка в несколько сотен кил, то наверно будет тормозить?
Регулярка это первое что в голову пришло, просто решил убедиться.

А какие мысли по скорости, опускать строку или регулярка?, файлов много и попадаются большие.

А FindString правильно работает с регистром.


Может быть с памятью будет быстрее выстреливать.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
text.s = "Я Супер Текст, Я Такой Длинный, Что аж До ГоризонтА"
SearchStr.s = "Что аж"
NewText.s = "Тут Был Я"
 
len.l = Len(text)
SearchLen.l = Len(SearchStr)
NewLen.l  = Len(NewText)
 
For i=0 To len
  If CompareMemoryString(@text+i, @SearchStr, #PB_String_NoCase, SearchLen) = #PB_String_Equal
    LeftLen.l = @text+i-@text
    MemLeft.s = Space(LeftLen)
    PokeS(@MemLeft, text, @text+i-@text)
    ;Debug MemLeft
   
    RightLen.l = (@text+Len)-(@text+i+SearchLen)
    MemRight.s = Space(RightLen)
    PokeS(@MemRight, PeekS(@text+i+SearchLen, RightLen), RightLen)
    ;Debug MemRight
   
    text = ""
    text = Space(LeftLen+RightLen+NewLen)
    PokeS(@text, MemLeft, LeftLen)
    PokeS(@text+LeftLen, NewText, NewLen)
    PokeS(@text+LeftLen+NewLen, MemRight, RightLen)
   
    len = Len(text)
  EndIf
Next i
 
Debug text


_________________
Детям нельзя в интернет. От детей интернет тупеет.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReplaceString и регистр символов
СообщениеДобавлено: Сб авг 15, 2015 2:31 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6313
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
newJS писал(а):
Виталь, если строка в несколько сотен кил, то наверно будет тормозить?
Регулярка это первое что в голову пришло, просто решил убедиться.
А какие мысли по скорости, опускать строку или регулярка?, файлов много и попадаются большие.

Всё познается в сравнении. Напиши все варианты и сравни.
Заодно и народу будет интересно.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReplaceString и регистр символов
СообщениеДобавлено: Сб авг 15, 2015 3:46 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 230
Благодарил (а): 31 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
Наверно лучше не тянуть, и послать багрепорт буржуям, Фред взялся фиксить все подряд(судя по форуму), если поспешить, глядишь и в 5.40 пофиксят уже.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReplaceString и регистр символов
СообщениеДобавлено: Сб авг 15, 2015 4:55 pm 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 624
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
kvitaliy писал(а):
Всё познается в сравнении. Напиши все варианты и сравни.

Сравнивать не чего, это убивает строку, опускает ниже плинтуса все букавки.
Код:
1
s2=ReplaceString(LCase(s), LCase(re1), re2, #PB_String_NoCase)



m0t0d0r писал(а):
Может быть с памятью будет быстрее выстреливать.

По идее да, забрал, буду пробовать.

Kuzmat писал(а):
Наверно лучше не тянуть, и послать багрепорт буржуям

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

Всем спасибо.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReplaceString и регистр символов
СообщениеДобавлено: Сб авг 15, 2015 6:06 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 880
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
newJS писал(а):
По идее да, забрал, буду пробовать.

В моём примере есть один недостаток, это мой недочёт
Между 27 - 28 строками надо впихнуть
Код:
1
i   = (@text+LeftLen+NewLen)-@text


Иначе при замене к примеру
"Текст" на "Длинный Текст"
будет бесконечная замена

_________________
Детям нельзя в интернет. От детей интернет тупеет.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReplaceString и регистр символов
СообщениеДобавлено: Сб авг 15, 2015 6:24 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11189
Благодарил (а): 4 раз.
Поблагодарили: 416 раз.
Почему бы тогда не написать проще.
Код:
1
i   = LeftLen+NewLen


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReplaceString и регистр символов
СообщениеДобавлено: Сб авг 15, 2015 7:26 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 880
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
Пётр писал(а):
Почему бы тогда не написать проще.
Код:
1
i   = LeftLen+NewLen


Вот у меня так всегда, быстро напишу, а потом пол года исправляю недоделки, не только в программировании, но и везде.
Хотя в этом случае было правильно и так и так :D

_________________
Детям нельзя в интернет. От детей интернет тупеет.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReplaceString и регистр символов
СообщениеДобавлено: Вс авг 16, 2015 6:46 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 624
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
m0t0d0r у меня вообще пример не работает.
Вывел в дебуг, он показывает отсутствие срабатывания проверки
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
text.s = "Я Супер Текст, Я Такой Длинный, Что аж До ГоризонтА"
SearchStr.s = "Что аж"
NewText.s = "Тут Был Я"
 
len.l = Len(text)
SearchLen.l = Len(SearchStr)
NewLen.l  = Len(NewText)
 
For i=0 To len
f=CompareMemoryString(@text+i, @SearchStr, #PB_String_NoCase, SearchLen)
If f=#PB_String_Equal
LeftLen.l = @text+i-@text
MemLeft.s = Space(LeftLen)
PokeS(@MemLeft, text, @text+i-@text)
;Debug MemLeft
RightLen.l = (@text+Len)-(@text+i+SearchLen)
MemRight.s = Space(RightLen)
PokeS(@MemRight, PeekS(@text+i+SearchLen, RightLen), RightLen)
;Debug MemRight
text = ""
text = Space(LeftLen+RightLen+NewLen)
PokeS(@text, MemLeft, LeftLen)
PokeS(@text+LeftLen, NewText, NewLen)
PokeS(@text+LeftLen+NewLen, MemRight, RightLen)
len = Len(text)
 
EndIf
Debug Bool(f=#PB_String_Equal); всегда ноль, ХР РВ530
Debug Bool(f=#PB_String_Lower)
Debug Bool(f=#PB_String_Greater)
Debug "-"
Next i
     
Debug text




А с регуляркой облом, в простом тексте встречаются метасимволы, в итоге регулярка ищет чёрте что, получается что каждый раз нужно в строке поиска подставлять слеши под символы которые для регулярки являются метасимволами, пока отказался от этой затеи.


Когда то на 511 изворачивался из за отсутствия обратных ссылок в регулярке таким способом, вчера вспомнил про это дело уже под занавес, сегодня буду пробовать.
Код:
1
2
3
FindString()
RemoveString()
InsertString()



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReplaceString и регистр символов
СообщениеДобавлено: Вс авг 16, 2015 9:58 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 624
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
Да уж, плавность изгиба рук Фреда желает быть лучше.
RemoveString(), то же самое, по англицки понимает, по русски нет.
Я пока в тупике, пойду репу чесать, мне нужно решить эту загадку.
Есть еще какие мысли, как обойти?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReplaceString и регистр символов
СообщениеДобавлено: Вс авг 16, 2015 10:05 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 880
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
newJS писал(а):
m0t0d0r у меня вообще пример не работает.
Вывел в дебуг, он показывает отсутствие срабатывания проверки

Настройки, убрать галку юникода
Файл -- Формат файла -- кодировка простой текст.

newJS писал(а):
А с регуляркой облом, в простом тексте встречаются метасимволы, в итоге регулярка ищет чёрте что, получается что каждый раз нужно в строке поиска подставлять слеши под символы которые для регулярки являются метасимволами, пока отказался от этой затеи.

Ну так и подставь в тексте слеши перед проверкой, хотя это тот же replacestring() :D . порочный круг :D

_________________
Детям нельзя в интернет. От детей интернет тупеет.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB