purebasic.info

PureBasic forum
Текущее время: Пн дек 11, 2017 4:36 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 53 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Чт май 25, 2017 11:52 am 
Не в сети
док

Зарегистрирован: Чт ноя 22, 2007 8:03 pm
Сообщений: 165
Откуда: Питер
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
AZJIO
viewtopic.php?f=6&t=954&start=75#p81619


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Чт июл 27, 2017 2:28 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 387
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
Всем привет!
Прошу помощи у знатоков регэкспов.
Имеется файл, примерно следующего содержания:
Код:
1
{"D": [{"D": [], "F": [{"B": 0, "N": "КРАМС.dat", "P": 0, "S": 11, "SP": 19}], "N": "Другая информация", "P": 0}, {"D": [], "F": [{"B": 19, "N": "Руководство пользователя.dat", "P": 0, "S": 10, "SP": 18}], "N": "Рабочие документы", "P": 0}, {"D": [{"D": [], "F": [{"B": 60, "N": "просто текст.dat", "P": 0, "S": 114, "SP": 91}], "N": "Подпапка", "P": 0}], "F": [{"B": 37, "N": "Новый документ.dat", "P": 0, "S": 15, "SP": 23}], "N": "Тестовая папка 1", "P": 0}], "F": [], "N": "", "P": 0}


нужно составить регулярное выражение, которое бы выдавало все значения поля "SP". Если возможно, то последовательно от начала документа до конца. Потому, что потребуется также самое крайнее значение "SP".


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Чт июл 27, 2017 2:58 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
knower писал(а):
все значения поля "SP". Если возможно, то последовательно от начала документа до конца

если правильно понял ТЗ :) то возможно это подойдет:
https://regex101.com/r/ZDvZ6Y/1
code
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Procedure RegularExpressionString(string.s, RegExp.s, Array ArrayResult.s(1))
Protected NbFound.i=0, RegExpID.i
RegExpID=CreateRegularExpression(#PB_Any, RegExp)
 If RegExpID
    NbFound = ExtractRegularExpression(RegExpID, string, ArrayResult())
    FreeRegularExpression(RegExpID)
  Else
    MessageRequester("Information", RegularExpressionError())
  EndIf
ProcedureReturn NbFound
EndProcedure
 
Dim ArrayResult.s(0)
 
string.s ="{"+Chr(34)+"D"+Chr(34)+": [{"+Chr(34)+"D"+Chr(34)+": [], "+Chr(34)+"F"+Chr(34)+": [{"+Chr(34)+"B"+Chr(34)+": 0, "+Chr(34)+"N"+Chr(34)+": "+Chr(34)+"КРАМС.dat"+Chr(34)+", "+Chr(34)+"P"+Chr(34)+": 0, "+Chr(34)+"S"+Chr(34)+": 11, "+Chr(34)+"SP"+Chr(34)+": 19}], "+Chr(34)+"N"+Chr(34)+": "+Chr(34)+"Другая информация"+Chr(34)+", "+Chr(34)+"P"+Chr(34)+": 0}, {"+Chr(34)+"D"+Chr(34)+": [], "+Chr(34)+"F"+Chr(34)+": [{"+Chr(34)+"B"+Chr(34)+": 19, "+Chr(34)+"N"+Chr(34)+": "+Chr(34)+"Руководство пользователя.dat"+Chr(34)+", "+Chr(34)+"P"+Chr(34)+": 0, "+Chr(34)+"S"+Chr(34)+": 10, "+Chr(34)+"SP"+Chr(34)+": 18}], "+Chr(34)+"N"+Chr(34)+": "+Chr(34)+"Рабочие документы"+Chr(34)+", "+Chr(34)+"P"+Chr(34)+": 0}, {"+Chr(34)+"D"+Chr(34)+": [{"+Chr(34)+"D"+Chr(34)+": [], "+Chr(34)+"F"+Chr(34)+": [{"+Chr(34)+"B"+Chr(34)+": 60, "+Chr(34)+"N"+Chr(34)+": "+Chr(34)+"просто текст.dat"+Chr(34)+", "+Chr(34)+"P"+Chr(34)+": 0, "+Chr(34)+"S"+Chr(34)+": 114, "+Chr(34)+"SP"+Chr(34)+": 91}], "+Chr(34)+"N"+Chr(34)+": "+Chr(34)+"Подпапка"+Chr(34)+", "+Chr(34)+"P"+Chr(34)+": 0}], "+Chr(34)+"F"+Chr(34)+": [{"+Chr(34)+"B"+Chr(34)+": 37, "+Chr(34)+"N"+Chr(34)+": "+Chr(34)+"Новый документ.dat"+Chr(34)+", "+Chr(34)+"P"+Chr(34)+": 0, "+Chr(34)+"S"+Chr(34)+": 15, "+Chr(34)+"SP"+Chr(34)+": 23}], "+Chr(34)+"N"+Chr(34)+": "+Chr(34)+"Тестовая папка 1"+Chr(34)+", "+Chr(34)+"P"+Chr(34)+": 0}], "+Chr(34)+"F"+Chr(34)+": [], "+Chr(34)+"N"+Chr(34)+": "+Chr(34)+""+Chr(34)+", "+Chr(34)+"P"+Chr(34)+": 0}"
RegExp.s ="(?<="+Chr(34)+"SP"+Chr(34)+":\s)[0-9]+(?=})"
 
If RegularExpressionString(string.s, RegExp.s, ArrayResult.s()) > 0
  For x = 0 To ArraySize(ArrayResult())
    Debug ArrayResult(x)
  Next
EndIf



PS: Мужики! если мне не изменяет память, где-то выкладывали (Возможно Пётр), описание как в PB писать строку, чтобы не заменять кавычки на Chr(34), там по моему какой-то знак в начале строки или перед переменной ставился. Во время не записал, а теперь хоть застрелись... не могу вспомнить :(


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Чт июл 27, 2017 3:29 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 387
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
registrymechanic, спасибо. Попробую.

Да, Пётр писал про замену chr(34) и если правильно понял, то речь об этом?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Чт июл 27, 2017 3:35 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11069
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
Это JSON, который можно разобрать без регулярных выражений.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Чт июл 27, 2017 3:46 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 387
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
registrymechanic, спасибо. Работает. Но как правильно сказал Пётр, да, это json. Нужно будет пересмотреть подход. Благо, что рекомендации получил.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Чт июл 27, 2017 4:04 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11069
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
knower писал(а):
Нужно будет пересмотреть подход.
Он довольно простой.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Global SizeS.q, SizeSP.q
 
Procedure GetSize(*Tree.TreeFiles)
  If *Tree
   
    ForEach *Tree\D()
      GetSize(*Tree\D())
    Next
   
    ForEach *Tree\F()
      SizeS + *Tree\F()\S
      SizeSP + *Tree\F()\SP
    Next
   
  EndIf
EndProcedure

Перед вызовом процедуры нужно обнулить переменные SizeS и SizeSP.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Чт июл 27, 2017 5:27 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 387
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
Пётр, ПРЕОГРОМНОЕ спасибо!!!
Теперь могу двигаться дальше.
офтоп
Сомневаюсь, что текста наберётся на 4 ГБ (это по поводу предложения записи в первых 4 или 8 байт). Тем более упакованного (просто нереально много).
Тоже была такая мысль подсчитывать эти значения ещё на этапе создания.
Пётр, если честно, то боюсь трогать этот уже рабочий механизм, поэтому пусть уже остаются два файла. Хотя предполагаю, что во втором случае нужно будет захватывать через CatchJSON().
Спасибо за информацию по HideGadget. Использую именно SetGadgetText. Значит бессмысленно. Убираю.
SplitterGadget пока не пошёл. Посмотрю позже.
Вобщем, спасибо за всё! За ценные советы!


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

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


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

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


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

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