PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » RegExpPB


RegExpPB

Сообщений 1 страница 26 из 26

1

RegExpPB

Тест регулярных выражение

Скачать (Windows, Linux) (или с upload.ee на франц. сайте)

https://i.imgur.com/DlVXM4F.png

Обновления
Добавлена история регулярных выражений с сохранением.
Добавлен хоткей Ctrl+Enter
Добавлен цвет таймера.
Добавлены параметры ini-файла: "Поверх всех окон", число пунктов истории.
Добавлено сохранение выбора библиотеки.

Отредактировано AZJIO (10.05.2022 10:17:11)

+1

2

Обновил, добавил библиотеки регулярных выражений. Пока только Linux, не было времени тестить на Windows.

0

3

AZJIO
С библиотекой уже юзабельней смотрится, но интерфейс начинает перегружаться, предложение вывести библиотеку в отдельное окно, добавить там рюшечек типа поиск\фильтр, подробное описание, группы, рейтинги...
файлы библиотек запихнуть например в локальную базу sqlite. в дальнейшем можно будет прикрутить работу и онлайн базой...

0

4

Пару идей подкину, можно допилить и добавить...

Код:
Procedure SendToRegex101(regex$, text$, replacement$="", flags$="gm", delimiter$="")
  Protected url$="https://regex101.com/"
  url$ = SetURLPart(url$, "flavor", "pcre")
  If Len(regex$)
    url$ = SetURLPart(url$, "regex", regex$)
  Else
    ProcedureReturn
  EndIf
  If Len(text$)
    url$ = SetURLPart(url$, "testString", text$)
  Else
    ProcedureReturn
  EndIf
  url$ = SetURLPart(url$, "flags", flags$)
  If Len(replacement$)
    url$ = SetURLPart(url$, "subst", replacement$)
  EndIf
  If Len(delimiter$)
    url$ = SetURLPart(url$, "delimiter", delimiter$)
  EndIf
  url$ = URLEncoder(url$)
  ;Debug url$
  RunProgram(url$)
EndProcedure


regex$ = "[A-Za-z0-9._-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}"
text$ = "technic aaa@mail.ru e" + #CRLF$ + "work aa1@mail.com yes"
flags$ = "m"
replacement$ = "mail"
delimiter$ = "#"

SendToRegex101(regex$, text$)
;SendToRegex101(regex$, text$, replacement$, flags$ )

If CreateRegularExpression(0, regex$)
  If ExamineRegularExpression(0, text$)
    While NextRegularExpressionMatch(0)
      Debug "Match: " + RegularExpressionMatchString(0)
      Debug "    Position: " + Str(RegularExpressionMatchPosition(0))
      Debug "    Length: " + Str(RegularExpressionMatchLength(0))
    Wend
  EndIf
Else
  Debug RegularExpressionError()
EndIf
Код:
InitNetwork()
Enumeration 
  #JSON_Parse
  #RegEx  
EndEnumeration

Structure Regex101
  regex.s
  testString.s
  flags.s
  delimiter.s
  flavor.s
  substitution.s
  listSubstitution.s
  title.s
  isFavorite.i
  isEditable.i
  isOwner.i
  isLibraryEntry.i 
  libraryDescription.s
  libraryTitle.s
  libraryAuthor.s
  tags.i
  error.s
  errorId.s
EndStructure

Procedure.s TestRegex101(url$)
  HttpRequest = HTTPRequest(#PB_HTTP_Get, url$)
  If HttpRequest
    Response$ = HTTPInfo(HTTPRequest, #PB_HTTP_Response)
    FinishHTTP(HTTPRequest)
    ;Debug Response$
  Else
    Debug "Request creation failed"
  EndIf
  
  ParseJSON(#JSON_Parse, Response$)
  ExtractJSONStructure(JSONValue(#JSON_Parse), @R.Regex101, Regex101)
  
  If Len(R\error)
    Debug "ERROR: " + R\error
  Else
    If R\flavor = "pcre" Or R\flavor = "pcre2" ; pcre2 not tested
      Debug "TITLE: " + R\libraryTitle
      Debug "REGEX: " + R\regex
      Debug "TEST STRING: " + R\testString
      Debug "AUTOR: " + R\libraryAuthor
    Else
      Debug R\flavor + " not support"
    EndIf
  EndIf
  
  Debug #CRLF$ +"++++++++ TESTING +++++++"
  If CreateRegularExpression(#RegEx, R\regex)
    If ExamineRegularExpression(#RegEx, R\testString)
      While NextRegularExpressionMatch(#RegEx)
        Debug "Match: " + RegularExpressionMatchString(#RegEx)
        Debug "    Position: " + Str(RegularExpressionMatchPosition(#RegEx))
        Debug "    Length: " + Str(RegularExpressionMatchLength(#RegEx))
      Wend
    EndIf
  Else
    Debug RegularExpressionError()
  EndIf
  
EndProcedure

Input$ = InputRequester("Title", "Please input url from regex101 :", "https://regex101.com/r/68YGMg/")
Version$ = "1"
JsonURL$ = ReplaceString(Input$, "/r/", "/api/regex/") + Version$

TestRegex101(JsonURL$)
RunProgram(Input$)

сторонняя библиотека: https://regex101.com/library?filterFlav … mp;search=
json: https://regex101.com/api/library/1/?fil … mp;search=
API: https://github.com/firasdib/Regex101/wiki/API

0

5

Lin написал(а):

рейтинги

Это практически все мои личные регулярки, я не собирался делать какой-то комбайн. Практически все регулярки делаются под конкретные задачи и нет такого что сделал  десяток для обработки html и на этом всё, там можно тысячами придумывать под индивидуальные задачи. Меняется синтаксис, меняется и регвыр, меняется запрос/избирательность, меняется регвыр, нужна оптимизация для скорости работы, опять же меняется регвыр. У меня лишь примеры показывающие как это работает, библиотека "примеры" содержит примитивные примеры для показа свойств метасимволов и прочего. На самом деле прога уже написана на AutoIt3 для Windows и работает в Linux с Wine. Делать в отдельном окне не хочу, если только плавающее как панель инструментов, но пока не вижу проблем, так как можно сделать на весь экран и список регвыров доступен. Про онлайн сервисы я в курсе, я сам делал шапку на руборде, куда я даю ссылку из проги, там представлены все эти сервисы и даже больше. Я перечитал все краткие учебники/справочники и на основе них сделал свой справочник на мой взгляд идеальный и полноценный, в нём всё представлено понятным не птичьим языком, приведены примеры использования, так что даже когда на форуме AutoIt3 спецы удивлялись переведя  через гугл, что у меня раскрыты все нюансы, даже в справке AutoIt3 не было такого, но благодаря моему участию и критике всё уже есть. А кому нужно больше, рекурсивные вызовы и прочие сложные конструкции, велком на офсайт движка регвыр, то есть к авторам с их длинной простынёй описания всех мелочей на английском языке.

Обновил
Добавил 2 кнопки "Добавить" и "Удалить", чтобы сохранить регвыр в библиотеку или удалить.

Отредактировано AZJIO (27.04.2022 17:55:40)

0

6

AZJIO
ну я предложил, а там уже как хочешь...

AZJIO написал(а):

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

а сами шаблоны уже придумал? если да то поделись видением, думаю добавить генератор в regex101 но с видом шаблона ещё не определился..

Отредактировано Lin (28.04.2022 19:17:59)

0

7

Lin написал(а):

а сами шаблоны уже придумал?

шаблоны уже есть в папке "template". Суть когда нажимаешь кнопку "Copy" то в буфер обмена вставляется готовый пример, который можно вставить в свой код или просто потестировать. Но можно пойти дальше, сейчас 5 шаблонов по количеству опций: поиск, замена, массив, группы, пошаговый. Но так как для разных случаев шаблоны могут быть разные, то можно сделать открытие выбора файла для шаблона, тогда их можно хоть 10, хоть 100 делать, а не ограничиваться одним на каждый пункт. Далее можно сделать в папке template папки типов файлов, например "pb", "js" и т.д. тогда в каждую можно положить шаблоны для конкретного типа языка программирования, то есть прога не будет привязана только к PureBasic.

0

8

AZJIO написал(а):

Lng(18) = "(?x) игнор пробелов и коммент."

AZJIO написал(а):

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

#PB_RegularExpression_Extended  : whitespace and '#' comments will be ignored.

whitespace - пустой символ, потерялись "табуляция, перенос страницы, возврат каретки, перевод строки" (CRLF, CR, LF, FF)

я вот не понял зачем и как нужен #PB_RegularExpression_AnyNewLine, желательно пример

AZJIO написал(а):

Суть когда нажимаешь кнопку "Copy" то в буфер обмена вставляется готовый пример, который можно вставить в свой код или просто потестировать.

именно это и будет в regex101, рассматриваю вариант нескольких примеров в одном "выхлопе", пока вот такое накидал:

Код:
Pattern$ = "color=(red|green|blue)"
String$ = "stype=bold, color=blue, margin=50, color=red"
Global pb_fags = 0  ;  заглушка

; Example 1:
; Tests the string against the Regular Expression
Procedure TestMatchRegular(Pattern$, String$)
  Protected RegExID = CreateRegularExpression(#PB_Any, Pattern$, pb_fags)
  If RegExID
    Protected Result = MatchRegularExpression(RegExID, String$)
    FreeRegularExpression(RegExID) ; Release its associated memory.
    ProcedureReturn Result
  Else
    Debug RegularExpressionError() ; Returns an human readable error about the latest failure
  EndIf
EndProcedure
If TestMatchRegular(Pattern$, String$)
  Debug "The string match!" + #CRLF$
Else
  Debug "No pattern found in the string" + #CRLF$
EndIf

; Example 2:
; Extract the string matched
Procedure TestMatchs(Pattern$, String$)
  Protected RegExID = CreateRegularExpression(#PB_Any, Pattern$, pb_fags)
  If RegExID
    If ExamineRegularExpression(RegExID, String$)
      While NextRegularExpressionMatch(RegExID)
        Debug "Match: " + RegularExpressionMatchString(RegExID)
        Debug "    Position: " + RegularExpressionMatchPosition(RegExID)
        Debug "    Length: "   + RegularExpressionMatchLength(RegExID)
        Debug #CR$
      Wend
    EndIf
    FreeRegularExpression(RegExID) ; Release its associated memory.
    ProcedureReturn #True
  Else
    Debug RegularExpressionError() ; Returns an human readable error about the latest failure 
  EndIf
EndProcedure
TestMatchs(Pattern$, String$)

; Example 3: 
; Extract the string matched by a group within the regular expression
Procedure TestGroups(Pattern$, String$)
  Protected RegExID = CreateRegularExpression(#PB_Any, Pattern$, pb_fags)
  Protected CountGroups = CountRegularExpressionGroups(RegExID)
  If Not CountGroups
    ProcedureReturn #False
  EndIf
  If RegExID
    If ExamineRegularExpression(RegExID, String$)
      While NextRegularExpressionMatch(RegExID)
        For IndexGroup = 1 To CountGroups
          Debug "Group " + IndexGroup + ": " + RegularExpressionGroup(RegExID, IndexGroup)
          Debug "    Position: " + RegularExpressionGroupPosition(RegExID, IndexGroup)
          Debug "    Length: "   + RegularExpressionGroupLength(RegExID, IndexGroup) + #CRLF$
        Next
      Wend
    EndIf
    FreeRegularExpression(RegExID) ; Release its associated memory.
    ProcedureReturn #True
  Else
    Debug RegularExpressionError() ; Returns an human readable error about the latest failure 
  EndIf
EndProcedure
TestGroups(Pattern$, String$)

0

9

Lin написал(а):

CRLF, CR, LF, FF

строка PureBasic не позволяет использовать эти символы, также как и тестовое поле в тестировщике.

Lin написал(а):

именно это и будет в regex101, рассматриваю вариант нескольких примеров в одном "выхлопе", пока вот такое накидал:

в шаблонах можно также сделать 3 примера в одном файле и тестировщик выдаст этот тройной пример.

Отредактировано AZJIO (01.05.2022 15:47:48)

0

10

AZJIO написал(а):

строка PureBasic не позволяет использовать эти символы

а так?

Код:
Pattern$ = "(?x)color=(red|green|bl"+#CRLF$+#CR$+#LF$+#TAB$+#FF$+"ue)"

вторая цитата взята отсюда: http://forum.ru-board.com/topic.cgi?for … &m=2#1
и там тоже потерялись переносы

AZJIO написал(а):

также как и тестовое поле в тестировщике.

немного не понял что есть "тестовое поле", но в поле "Регулярное выражение для поиска" - поддерживает и работает

0

11

Lin написал(а):

а так?

Тогда можно и так.

Код:
Pattern$ = ~"(?x)color=(red|green|bl\r\n\r\n\t\fue)"
Lin написал(а):

я вот не понял зачем и как нужен #PB_RegularExpression_AnyNewLine, желательно пример

Видимо связано с символами новой строки в разных платформах.

0

12

Lin
Это псевдо пример, мы же имеем ввиду использование пробельных символов для форматирования регулярного выражения, то есть разделения его на блоки, строки, комментарии, а то что можно вставить это в одной строке это другое. То есть мы можем вставлять пробельные символы но не идентифицировать их как используемые, а лишь для форматирования текста, лёгкого восприятия сложных регекспов. Ведь если написать PureBasic в одну строку его тоже будет практически невозможно понять.

#PB_RegularExpression_AnyNewLine на сколько я это понимаю но не тестировал, это когда указываешь \n (возможно \R), от если файл смешанный (или не смешанный) и перенос может быть как комбинацией \r\n или \n или \r, то регексп проглотит это как один перенос строки, хотя там 2 символа, возможно в что флаг мультистрока будет действовать для любого из этих символов, ведь в рег выре можно указать

Код:
(*CR)	Carriage return (@CR).
(*LF)	Line feed (@LF).
(*CRLF)	Carriage return immediately followed by linefeed (@CRLF).
(*ANYCRLF)	Any of @CRLF, @CR or @LF. This is the default newline convention.
(*ANY)	Any Unicode newline sequence: @CRLF, @LF, VT, FF, @CR or \x85.

0

13

AZJIO написал(а):

Это псевдо пример, мы же имеем ввиду использование пробельных символов для форматирования регулярного выражения, то есть разделения его на блоки, строки, комментарии,

ну вот же пример "на пальцах" - мультистроковая регулярка, разделенная на блоки типа для удобства...
https://i117.fastpic.org/big/2022/0501/ef/87789f45c04a5778d65ce3176c8543ef.png
https://i117.fastpic.org/big/2022/0501/8e/a32995750e1aa746167a420b8c56d48e.png

0

14

Пётр написал(а):

Видимо связано с символами новой строки в разных платформах.

Ага, уже разобрался...

Код:
Pattern$ = "^\w+ \w+$"
String$ = "Hello one" + #CR$+ "world two"
RegExID = CreateRegularExpression(#PB_Any, Pattern$, #PB_RegularExpression_MultiLine|#PB_RegularExpression_AnyNewLine)
If RegExID
  If ExamineRegularExpression(RegExID, String$)
    While NextRegularExpressionMatch(RegExID)
      Debug "Match: " + RegularExpressionMatchString(RegExID) + #CR$
    Wend
  EndIf
EndIf

0

15

AZJIO написал(а):

ну вот же пример "на пальцах"

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

Сделал пример истории, чуть позже вмонтирую.

0

16

AZJIO написал(а):

так этот пример на пальцах

имхо, без разницы, ладно в программе (так автор видит), но получается "справочник на мой взгляд идеальный и полноценный" на самом деле не полный?

0

17

Lin
Я в своей практике не использую многострочные регулярные выражения и с многими с которыми я общаюсь с трудом могут составить логичное регулярное выражение. Из этого вывод зачем забивать головы неиспользуемым, если более важные первого уровня вещи человек не понимает? Когда научится перейдёт на официальный сайт и будет более глубоко разбираться, но обычно до этого дело не доходит, так как это много отнимает времени. Я не против если вы переведёте официальную справку и выложите нам на обозрение, как человек в совершенстве разбирающийся и которого не устраивает урезанный вариант. Лично я не хочу тратить на это время, даже в первом приближении быстро прокручивая всю эту простыню и ища интересные моменты, нахожу что мне хватает того что я знаю, а лишнее так и не удавалось применить, получается ты пытаешься применить ради применения, а это обычно происходит в счёт более важных дел которые начинают игнорироваться. так что я разумно трачу своё время. О существовании официальной я заявил, никого не заставляю пользоваться моим вариантом. Я лишь сказал что многие кто читал мой вариант более в полной мере понимали сомнительные моменты. И, кстати, движок развивается, если раньше он работал только с латинскими буквами в плане границ слова и не слова, в плане метасимвола слова, в плане верхнего и нижнего регистра, то теперь это работает для UTF-8, возможно зависит от флагов компиляции, не важно, просто идеально тестируя все сомнительные моменты я отписывал поведение на тот момент старой версии, то есть база примеров содержит текст где упоминается о том что это работает только для латинских букв, сразу предупреждаю, что я не переделывал свою старую базу и флаги скорее всего будут изменены на битовые флаги. То есть сейчас если делать свою базу, то она потом не будет работать, потому что сейчас я сделал совместимость со старой базой, флаги 1, 2, 3, 4, 5, а будут 1, 2, 4, 8, 16 и т.д.

Обновления
Добавлена история регулярных выражений с сохранением.
Добавлен хоткей Ctrl+Enter
Добавлен цвет таймера.
Добавлены параметры ini-файла: "Поверх всех окон", число пунктов истории.
Добавлено сохранение выбора библиотеки

Ещё обновление
Флаги теперь битовые, сохраняются и читаются (библиотеки конвертированы с битовым флагом)
Проверка если в поле замены ссылки на группы, то ставится галочка поддержки групп.

Отредактировано AZJIO (02.05.2022 23:45:51)

0

18

AZJIO написал(а):

Я в своей практике не использую многострочные регулярные выражения

Имхо, например вполне удобно объяснять новичкам как работают регулярки,
пример регулярки с блэк-джеком и многостроками:

Код:
^          #начало строки
	(\w+)  #слово
	.+?    #любая последовательность (не жадная)
	(\d+)  #число
$          #конец строки

зы: Ну, нет - так нет, я всё..

0

19

Lin
комментарий начинается на "#" и заканчивается переносом строки? Просто я знаю что есть язык, в котором регулярные выражения можно писать таким образом, а то как я знаю записывается так (?#это комментарий), а если в начале строки (?#), то в строке игнорируются пробелы и можно писать так

Код:
(?x)   ^   (.*\\)   ([^\\]+?)   (\.[^.]+)?   $

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

Посмотри тут последнюю главу, где сказано:

Язык CoffeScript задаёт собственный синтаксис регулярных выражений, который называется hereRegex. Забавно, синтаксис hereRegex поддерживает комментарии внутри регулярного выражения, но:

Не пойму правильно ли я сделал добавив флаги чекбоксы, ведь все они могут быть заданы флагами в самом регулярном выражении типа (?s) и т.д.

Отредактировано AZJIO (03.05.2022 05:27:24)

0

20

https://i117.fastpic.org/thumb/2022/0503/9e/bcae1dbf125ae0f50da2532ecf76a89e.jpeg  https://i117.fastpic.org/thumb/2022/0503/74/889db49ed64691a5184aff5f82c9bf74.jpeg https://i117.fastpic.org/thumb/2022/0503/4f/ef80be8d32198c352f07a494b8bf3a4f.jpeg https://i117.fastpic.org/thumb/2022/0503/14/0200852e09f1379395a8c4ecce6b3f14.jpeg

http://www.pcre.org/original/doc/html/p … html#SEC22

There are two ways of including comments in patterns that are processed by PCRE.
....
abc #comment \n still comment
On encountering the # character, pcre_compile() skips along, looking for a newline in the pattern. The sequence \n is still literal at this stage, so it does not terminate the comment. Only an actual character with the code value 0x0a (the default newline) does so.

AZJIO написал(а):

Не пойму правильно ли я сделал добавив флаги чекбоксы,

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

Отредактировано Lin (03.05.2022 15:11:14)

0

21

Lin написал(а):

в разных местах можно включать и выключать - это уже другая история

история та же, в начале строки если флаг (?si) он действует на то что справа, поэтому и получается глобальный, но его можно также отменить (?-i), при чём что для одного что для второго варианта.

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

Lin написал(а):

в локальную базу sqlite

если бы не размер ещё +3 Мб, можно было бы использовать. Проще типа xml или json. По крайней мере json у меня не увеличивал размер исполняемого файла, ну может 15 кб, надо ещё раз проверить. Даже вместо Scintilla можно было бы использовать RTF, но не было бы кроссплатформенности, в линукс, не было бы подсветки.

Отредактировано AZJIO (03.05.2022 16:48:24)

0

22

Обновление
Функция рег.выв изменена.
Добавлен чекбокс поддержки \r\n\t

0

23

Хорошо бы прикрутить "Старт" по F5 или сделать назначение клавиши. При множественном тестировании регулярок, постоянно перемещать мышку на кнопку становится раздражающим действием.

0

24

Webarion
Сейчас Ctrl + Enter

0

25

AZJIO написал(а):

Webarion
Сейчас Ctrl + Enter

Ок! Спасибо за исходник. Собрал себе с F5, так привычнее. У меня и версия под AutoIt давно с этой клавишей.

0

26

Обновления
Добавлена справка RegExp.chm
Добавлена галка "Поверх всех окон"
Добавлена кнопка "Переместить вверх" для обработки текста многократно разными регулярными выражениями.

+1

Похожие темы


Вы здесь » PureBasic - форум » PureBasic для Windows » RegExpPB