purebasic.info

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

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




Начать новую тему Ответить на тему  [ Сообщений: 53 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Ср дек 14, 2016 6:08 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2232
Откуда: Russia — Belarus
Благодарил (а): 0 раз.
Поблагодарили: 66 раз.
Пункты репутации: 11
Или вот:
^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$
Отсюда:
https://www.safaribooksonline.com/libra ... 07s16.html

Вообще, это очень распространенная задача, легко гуглится ("ipv4 regexp").

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Ср дек 14, 2016 2:25 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 387
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
LinXP, спасибо.
qpAHToMAS, спасибо большое. Подходит, но пришлось дополнительную проверку сделать (не более 255). Вот код:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Dim result$(0)
 
IP$ = "192.168.255.123"
regExp = CreateRegularExpression(#PB_Any, "^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$")
 
If regExp
  If ExtractRegularExpression(regExp, IP$, result$()) = 1 And result$(0) = IP$
    a=Val(StringField(IP$,1,"."))
    b=Val(StringField(IP$,2,"."))
    c=Val(StringField(IP$,3,"."))
    d=Val(StringField(IP$,4,"."))
   
    If a>255 Or b>255 Or c>255 Or d>255
      Debug "FAULT"
    Else
      Debug "Okay"
    EndIf
  Else
    Debug "FAULT"
  EndIf
  FreeRegularExpression(regExp)
Else
  Debug "Can't create regExp"
EndIf


можно было конечно в самом паттерне это оговорить, но по-моему так проще, нет?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Ср дек 14, 2016 8:03 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2232
Откуда: Russia — Belarus
Благодарил (а): 0 раз.
Поблагодарили: 66 раз.
Пункты репутации: 11
Вот еще один вариант :):
Код:
1
^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$|^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$


Учитывает "не более 255", и еще много чего, если судить по объему.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Чт дек 15, 2016 8:01 am 
Не в сети
профессор

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Чт дек 15, 2016 8:38 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 527
Благодарил (а): 51 раз.
Поблагодарили: 15 раз.
Пункты репутации: 5
knower писал(а):
Подходит, но пришлось дополнительную проверку сделать (не более 255). Вот код:

регулярка сама может диапазон проверять, тут написано как сделать, в самом низу пара ссылок, на чьей основе было сделано
Регулярное выражение для проверки RGB и RGBA
кто JS знает, это может помочь при отладке регулярки


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Чт дек 15, 2016 3:09 pm 
Не в сети
профессор
Аватар пользователя

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

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Чт дек 15, 2016 4:35 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 387
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
registrymechanic, с тем что мне малоизвестно так и поступаю (подгоняю под свои нужды). Обычно либо не достаёт нужных функций либо их наоборот в избытке, что приходится аккуратно избавляться от ненужного балласта. Попутно пытаюсь понять как оно работает.
Уже написал выше, что первый код qpAHToMAS'а вполне пригоден для моего случая, за что ему ещё раз говорю спасибо. Его паттерн переварил. Могу рассказать суть, а стоит ли? Сомневаюсь что это будет кому-то здесь интересно.
"много нюансов" - это точно. Регулярка она такая.
Да никакой тайны и нет вовсе. Прога работает с ини-файлом через OpenPreferences (как положено). Дело в том, что и сам не могу заранее знать что именно заблагорассудится туда вбить пользователю помимо самого IP. Собственно для этого и нужна была такая проверочка.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Чт дек 15, 2016 5:47 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 112
Откуда: Україна
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 4
knower писал(а):
Подходит, но пришлось дополнительную проверку сделать (не более 255).

https://regex101.com/r/cZ0fH3/1 тут же регулярка с отсеканием невалидных адресов, + можно проверить в деле и почитать описание


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Чт дек 15, 2016 6:35 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 387
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
LinXP, спасибо большое. Работает!
Только сейчас открыл ссылку через другой браузер. Древний IE отказался её открывать и до этого момента не видел содержимого страницы. Поэтому стал рассматривать код фантомаса. Ещё раз спасибо за рабочий вариант!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Пт дек 16, 2016 8:15 am 
Не в сети
профессор
Аватар пользователя

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

я имел ввиду, :D если что, просто учитывай, например это:
https://regex101.com/r/oJ2Kvq/2

тот же пример от LinXP, та же регулярка без изменений, но уже эта регулярка не видит 2 полноценных IP-шника.... по этому и говорю посмотри свой случай, и присмотрись к исходной строке, в которой ишешь, возможно нужно привязаться не к концу или началу строки а к каким либо другим знакам/"событиям".


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Пт дек 16, 2016 2:25 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 387
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
registrymechanic, спасибо за замечание. Если правильно понял, то ты говоришь про пробелы в адресах:
Код:
1
2
121.211.233.251 
 255.255.255.255


Это учтено. Хотел было уже использовать Trim, но обратил внимание что ReadPreferenceString сама режет лишние пробелы с обоих сторон строки.
registrymechanic писал(а):
присмотрись к исходной строке, в которой ишешь, возможно нужно привязаться не к концу или началу строки а к каким либо другим знакам/"событиям".

говорю же, что вынес задание ip в ini-файл (мне неведомо заранее что туда впишут), поэтому присматриваться к исходной строке приходится из самой программы :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Пт дек 16, 2016 7:03 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 387
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
заметил-таки в примере LinXP одну недопустимую ситуацию:
валидным признаётся также адрес 192.168.01.3
так что тут перевод из строки в число исправлял ситуацию. 001 - уже ошибка, но нужно если первая цифра числа после точки (или числа до первой точки самое начало выражения) = 0, то после неё не должно быть никаких символов или только точка!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Сб дек 17, 2016 1:18 am 
Не в сети
док

Зарегистрирован: Пн авг 13, 2012 3:19 pm
Сообщений: 80
Благодарил (а): 7 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Код:
1
2
3
 
^(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?1)){3}$
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Сб дек 17, 2016 8:10 pm 
Не в сети
профессор

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Регулярные выражения
СообщениеДобавлено: Ср май 24, 2017 7:56 am 
Не в сети
доцент

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 43
Благодарил (а): 4 раз.
Поблагодарили: 20 раз.
Пункты репутации: 0
asdf8 писал(а):
Для РВ нужно на оффоруме искать функцию regexp-замены с поддержкой обратных ссылок.

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


У меня как раз возник вопрос обратных ссылок. Функция ExtractRegularExpression возвращает группы, но без позиций и длины. А значит как написано в справке заменить с помощью ReplaceString не получится. Вывод, надо получить первый рег выр с помощью ExamineRegularExpression, чтобы получить его позицию и длину, затем, пройтись по найденной строке этим же рег.выром, но с поиском всех последовательных групп. Теперь можно из групп составить замену (от указанной позиции, один раз). Потом цикл повторить для второго шага поиска ExamineRegularExpression. Но если использовать вложенные группы, то тут ещё сложней, тогда надо вложенную группу искать в найденной группе. Прям для каждого регвыра придётся свой алгоритм писать.


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

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


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

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


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

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