purebasic.info

PureBasic forum
Текущее время: Чт июн 04, 2020 4:56 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Пн май 04, 2020 12:39 pm 
Не в сети
студент

Зарегистрирован: Вс сен 09, 2012 9:25 pm
Сообщений: 7
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
AZJIO писал(а):
То есть автор темы задал вопрос не соответствующий вашему?

Из прочитанного оригинального вопроса в первом сообщении я сделал вывод, что автор не смог сформулировать вопрос так, чтобы остальным стало понятно что он хочет. Но если внимательно прочитать, то это: выделение подстроки из строки.
AZJIO писал(а):
Ваша задача решается просто - поиск закрывающей скобки методом подсчёта открытых и закрытых скобок.

Извините, но это через одно место, пример рассмотрен ниже.

newJS писал(а):
если только пара скобок

В вашем примере будет найдена самая левая (первая) открывающаяся и самая левая (последняя в нашем написании) закрывающаяся скобка и текст будет взят не правильно:
Код:
1
2
3
4
5
6
7
s.s="..........(Привет (я пурик))========..(Привет пурик2)===========текст со скобками (текст) что-то там дальше продолжается"
rn=FindString(s, "(")
gn=FindString(s, ")")
If rn>0 Or gn>0 Or rn<gn; если есть обе скобки и открывающая перед закрывающей
s=Mid(s, rn+1, gn-rn-1); вырезаем между скобок
EndIf
Debug s


даст: «Привет (я пурик»

Попробуйте, оно ищет только первый раз включения скобок:
Код:
1
2
Debug ReverseString( StringField( ReverseString( StringField( "..........(Привет пурик)========..(Привет пурик2)===========текст со скобками (текст) что-то там дальше продолжается", 1, ")" ) ),1,"(" ) )
 


даст «Привет пурик».

Код:
1
2
Debug ReverseString( StringField( ReverseString( StringField( "..........(Привет (я пурик))========..(Привет пурик2)===========текст со скобками (нужный нам текст) что-то там дальше продолжается", 1, ")" ) ),1,"(" ) )
 


даст «я пурик».

Как изменить так, чтобы искать следующее вхождение тоже не вопрос: у нас есть процедура удаления подстроки, которой мы можем передать найденное в первой итерации: RemoveString(исходная_строка,"("+найденное в первом шаге+")").

В принципе это можно на асме переписать, но не сегодня ;) Если будет желание:
Имеем: строка в памяти, символ начала подстроки, символ конца подстроки.
Алгоритм типа такого: движемся по ячейкам памяти содержащим символы, находим первый закрывающий символ — адрес в регистр2, далее движемся в обратную сторону и находим первый открывающий символ — адрес в регистр1, перечитать в вывод строку между адресами в регистре 1 и 2.
Надо только не забывать, что некоторые стили письма подразумевают написание справа—налево.

Все примеры проверялись на PureBasic 5.72 (MacOS X - x64).


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Вт май 05, 2020 7:27 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 950
Благодарил (а): 103 раз.
Поблагодарили: 32 раз.
Пункты репутации: 5
BigElectricCat писал(а):
В вашем примере будет найдена самая левая (первая) открывающаяся и самая левая (последняя в нашем написании) закрывающаяся скобка и текст будет взят не правильно:

написано же, если в строке только одна пара скобок, всё остальное для проги ошибка
пример работает так, как надо в проге, выдёргивает текст между скобок, входящая строка ограничена 48 символами, больше ненужно

если в строке несколько пар, то изначально нужно задаваться вопросом, а какая пара нужна? и только после этого приступать к разбору скобок


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Ср май 06, 2020 7:40 am 
Не в сети
студент

Зарегистрирован: Вс сен 09, 2012 9:25 pm
Сообщений: 7
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
newJS писал(а):
если в строке только одна пара скобок, всё остальное для проги ошибка

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

Зачем задавать рамки, когда можно просто последовательно получить все подстроки (в произвольном случае любое их число входящее в строку с помощью рекурсии)?
Естественно я не писал пример в виде красивой процедуры с возможностью рекурсии, но написать так — дело пары минут.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Обрезка строки
СообщениеДобавлено: Ср май 06, 2020 11:11 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 950
Благодарил (а): 103 раз.
Поблагодарили: 32 раз.
Пункты репутации: 5
BigElectricCat
прога выискивает в строке разные кодировки цвета
A3DC67
#A3DC67
@A3DC67
23%#A3DC67
35%Red
rgb(123, 34, 57)
rgba(255, 23, 111, .56)
rgba(255, 23, 111, 0.56)
rgba(255, 23, 111, 200)
16777215
red, black, white.....
всё что на это непохоже, ошибка, зачем тут лишнее
максимальная длина строки расчитана на любителей лепить пробелы где не попадя в больших количествах


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

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


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

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


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

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