purebasic.info

PureBasic forum
Текущее время: Пт апр 27, 2018 11:38 am

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




Начать новую тему Ответить на тему  [ Сообщений: 90 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 07, 2011 10:15 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 810
Откуда: Нерезиновая
Благодарил (а): 21 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Del


Последний раз редактировалось Volkoff Пт июн 15, 2012 5:59 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 28, 2011 1:09 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2270
Откуда: Russia — Belarus
Благодарил (а): 5 раз.
Поблагодарили: 71 раз.
Пункты репутации: 11
Не могу понять как сделать проверку на IP v4, вот такой вариант:
Код:
1
[0-9][0-9][0-9]\.[0-9][0-9][0-9]\.[0-9][0-9][0-9]\.[0-9][0-9][0-9]


Не правильный, ибо позволит принимать IP адреса где в каждом "из четырех промежутков" (не помню как они называются) есть три цифры, т.е.:
192.168.122.133 или 192.185.123.232, но не: 192.168.1.133, 192.168.132.45 и т.п.
Как сделать условие, что цифр может быть от одной до трех?

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 28, 2011 2:21 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
qpAHToMAS писал(а):
Как сделать условие, что цифр может быть от одной до трех?
Код:
1
{1,3}

Но это тебе не поможет, т.к. нужно проверять валидность IP, попробуй так
Код:
1
\b(([01]?\d?\d|2[0-4]\d|25[0-5])\.){3}([01]?\d?\d|2[0-4]\d|25[0-5])\b


_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 28, 2011 2:30 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2270
Откуда: Russia — Belarus
Благодарил (а): 5 раз.
Поблагодарили: 71 раз.
Пункты репутации: 11
lakomet, в чем заключается проверка валидности? За {1,3} спасибо.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 28, 2011 2:40 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
А не проще решить эту задачу по старинке? Разделить строку по точкам с помощью StringField() и проверить наличие только цифр в количестве 1 - 3 штуки.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 28, 2011 2:57 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
qpAHToMAS писал(а):
в чем заключается проверка валидности?

Адрес вида:
Цитата:
531.220.133.27
или
Цитата:
120.111.257.44
будет невалидным!

Пётр писал(а):
А не проще решить эту задачу по старинке? Разделить строку по точкам с помощью StringField() и проверить наличие только цифр в количестве 1 - 3 штуки.
Это если у тебя в переменной a$=IP, а если у тебя текст в несколько Мб, то проще ExtractRegularExpression, а потом можно и по старинке.

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 30, 2011 5:05 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2270
Откуда: Russia — Belarus
Благодарил (а): 5 раз.
Поблагодарили: 71 раз.
Пункты репутации: 11
К слову о строках и выдергивании информации из них, вот например, код, который выдергивает все что находится между двумя "finder'ами".
Код:
1
2
3
4
5
6
7
8
9
10
string$ = "8190f5bf295edb45833865ac4486904ca176e4e0 name:Павел; d7fd0b490333092853a539a93cf8d20e5623fbb6"
 
#finder_left = "name:"
#finder_right = ";"
 
Debug FindString(string$, #finder_left, 0)
Debug FindString(string$, #finder_right, 0)
 
string$ = Mid(string$, FindString(string$, #finder_left, 0) + Len(#finder_left), FindString(string$, #finder_right, 0) - FindString(string$, #finder_left, 0) - Len(#finder_left))
Debug string$


Но не проще ли уже на таком увовне начать использовать регулярные выражения? Или все-таки такие конструкции будут легче, чем подключения регулярок?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 30, 2011 5:36 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
qpAHToMAS писал(а):
Но не проще ли уже на таком увовне начать использовать регулярные выражения? Или все-таки такие конструкции будут легче, чем подключения регулярок?


Моё маленькое имхо, всё зависит, от ситуации. Если у тебя одна тире десять таких строк, то можно и финдстрингами, мидами и т.д., а если строк тыщы :roll:
В добавок, если строки такие как в твоём примере, то ладно, а если между "name:" и ";" окажется "name:" :?:
В общем меня тоже интересует быстродействие парсинга, и если накодишь тест быстродействия, то будет тебе БОЛЬШУЩИЙ респект :wink:

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 30, 2011 5:56 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2270
Откуда: Russia — Belarus
Благодарил (а): 5 раз.
Поблагодарили: 71 раз.
Пункты репутации: 11
lakomet писал(а):
В добавок, если строки такие как в твоём примере, то ладно, а если между "name:" и ";" окажется "name:" Question

Да, этот код рассчитан только на поиск одного "элемента" и он всегда будет вырезать символы от самого левого finder_left, до первого встретившегося на пути finder_right с позиции того finder_left. В решаемой мной задаче этого функционала достаточно.

lakomet писал(а):
В общем меня тоже интересует быстродействие парсинга, и если накодишь тест быстродействия, то будет тебе БОЛЬШУЩИЙ респект Wink

Не по зубам. Могу только ElapsedMilliseconds'ом проверить время выполнения, но сам понимаешь, это не серьезно :P.

PS:
Если в код добавить хотя бы это:
Код:
1
CreateRegularExpression(0, "")


То размер исполняемого файла после компиляции будет увеличен на 33280 байт!

И в довесок (я знаю, всем на это наплевать :)):
Цитата:
Лицензия PCRE требует, чтобы уведомление о праве на распространение и сам текст лицензии были включены в любое программное обеспечение, использующее библиотеку. Так что если библиотека RegularExpression используется в программном обеспечении, которое будет опубликовано, вышеупомянутая лицензия должна быть включена в поставку.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт дек 01, 2011 6:04 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2270
Откуда: Russia — Belarus
Благодарил (а): 5 раз.
Поблагодарили: 71 раз.
Пункты репутации: 11
В предыдущем моем коде была ошибка, в том, что второй "finder" искался не с позиции найденного первого. Иначе говоря такой пример:
Код:
1
; name:Oleg;


Не подошел бы (из-за первого символа ввиде второго finder'а).

Так все работает:
Код:
1
2
3
4
5
6
7
8
string$ = "; name:Oleg; name:?;"
 
#finder_id_left = "name:"
#finder_id_left_len = 5
#finder_id_right = ";"
#finder_id_right_len = 1
 
Debug Mid(string$, FindString(string$, #finder_id_left, 0) + #finder_id_left_len, FindString(string$, #finder_id_right, FindString(string$, #finder_id_left, 0) + #finder_id_left_len) - (FindString(string$, #finder_id_left, 0) + #finder_id_left_len))


Константы с len'ами добавлены что бы сэкономить на высчитывании длины констант в программе через Len().

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт дек 01, 2011 7:33 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн сен 07, 2009 10:00 pm
Сообщений: 1046
Откуда: Николаев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Собрал для своего пользования, давно пользуюсь:
(Находит первое совпадение...)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
string$ = "; name:Oleg; name:?;"
 
 #finder_id_left = "name:"
 #finder_id_right = ";"
 
 
Procedure.s Between_2(string.s, L.s, R.s)
 Position = FindString(string, L.s, 1)
 string2.s = Right(string, Len(string)+1-Position-Len(L.s))
 Position2 = FindString(string2, R.s, 1)
 string3.s = Left(string2, Position2-1)
 If Position <> 0
  ProcedureReturn string3.s
 EndIf
EndProcedure
 
 
 
Debug Between_2(string$, #finder_id_left, #finder_id_right)


_________________
www.mirashic.narod.ru
Первое знакомство с PB


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт дек 02, 2011 5:16 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
Так находит все совпадения:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string$ = "; name:Oleg;name:?;" 
#StartFind$ = "name:"
#EndFind$   = ";"
Dim extracted$(0)
 
Procedure Extract(string.s, Array A.s(1))
     If CreateRegularExpression(0, "(?<=\b"+#StartFind$+")(.+?)(?="+#EndFind$+")")
          ProcedureReturn ExtractRegularExpression(0, string, A()) - 1
     EndIf
EndProcedure
 
Result = Extract(string$, extracted$())
 
For i = 0 To Result
     Debug extracted$(i)
Next


_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт июн 15, 2012 5:58 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 810
Откуда: Нерезиновая
Благодарил (а): 21 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
А с группами в пурике как-то можно работать?
(group1) = $1 etc


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 04, 2013 8:24 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2270
Откуда: Russia — Belarus
Благодарил (а): 5 раз.
Поблагодарили: 71 раз.
Пункты репутации: 11
Ищу человека для помощи в составлении нескольких Regexp'ов в PB. Возможна небольшая оплата...

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 04, 2013 8:54 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
qpAHToMAS, я могу помочь (бесплатно)

_________________
Пурик - лучший язык программирования


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

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


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

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


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

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