PDA

Просмотр полной версии : [Plugin] Pawn.Regex - полная поддержка регулярных выражений



urShadow
14.06.2016, 11:20
Pawn.Regex 1.1.1

Описание:
Pawn.Regex - это плагин, который позволяет работать с регулярными выражениями.
Почему он лучше других? Потому что позволяет получать результаты парсинга.

Функции:

native regex:regex_new(const pattern[], E_REGEX_FLAG:flags = REGEX_DEFAULT, E_REGEX_GRAMMAR:grammar = REGEX_ECMASCRIPT);
native regex_delete(&regex:r);

native regex_check(const str[], regex:r, E_MATCH_FLAG:flags = MATCH_DEFAULT);
native regex_match(const str[], regex:r, &match_results:m, E_MATCH_FLAG:flags = MATCH_DEFAULT);
native regex_search(const str[], regex:r, &match_results:m, &pos, startpos = 0, E_MATCH_FLAG:flags = MATCH_DEFAULT);
native regex_replace(const str[], regex:r, const fmt[], dest[], E_MATCH_FLAG:flags = MATCH_DEFAULT, size = sizeof dest);

native match_get_group(match_results:m, index, dest[], &length, size = sizeof dest);
native match_free(&match_results:m);

Пример:


#include <Pawn.Regex>

stock IsRpNickname(nickname[])
{
new regex:r = regex_new("[A-Z][a-z]+_[A-Z][a-z]+");

new check = regex_check(nickname, r);

regex_delete(r);

return check;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
new
regex:r_with_param = regex_new("\\/\\s*(\\w{1,15})\\s+(.+)"),
match_results:m,
cmd[16], params[256],
cmd_length, params_length;

if (regex_match(cmdtext, r_with_param, m))
{
match_get_group(m, 1, cmd, cmd_length);
match_get_group(m, 2, params, params_length);

match_free(m);
}
else
{
new regex:r = regex_new("\\/\\s*(\\w{1,15})\\s*");

if (regex_match(cmdtext, r, m))
{
match_get_group(m, 1, cmd, cmd_length);

match_free(m);
}

regex_delete(r);
}

printf("cmd '%s' (%d), params '%s' (%d)", cmd, cmd_length, params, params_length);

regex_delete(r_with_param);

return 1;
}

stock SplitAndPrint(str[])
{
new regex:r = regex_new("[^\\s]+");

if (r)
{
new match_results:m;
new startpos, pos;

while (regex_search(str, r, m, pos, startpos))
{
new word[128], length;

if (!match_get_group(m, 0, word, length))
{
break;
}

printf("word: %s", word);

startpos += pos + length;

match_free(m);
}

regex_delete(r);
}
}

stock ReplaceString(const str[], const regexp[], const fmt[], dest[], size = sizeof dest)
{
new regex:r = regex_new(regexp);

if (r)
{
regex_replace(str, r, fmt, dest, MATCH_DEFAULT, size);

regex_delete(r);
}
}

main()
{
new str[128];

ReplaceString("Pawn.CMD", "CMD", "Regex", str);

printf("%s", str);

SplitAndPrint("4 8 15 16 23 42");

OnPlayerCommandText(-1, "/ban 42");
OnPlayerCommandText(-1, "/kill");

printf("%d %d",
IsRpNickname("Your_Shadow"),
IsRpNickname("urShadow"));
}


Changelog:
1.0:
- First release.
1.1:
- Fixed bugs.
- Changed native "match_get_group"
1.1.1:
- Fixed error "File or function is not found"

Download binaries:
https://github.com/urShadow/Pawn.Regex/releases

Source code:
https://github.com/urShadow/Pawn.Regex

Daya
14.06.2016, 12:20
Хорошая программа, спасибо скача:smile:

ziggi
14.06.2016, 12:33
Ошибка при компиляции на Linux. Заменил syntax_option и match_flag на std::regex_constants, тогда скомпилировалось.


└─ $ gcc --version
gcc (GCC) 6.1.1 20160602
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.




gcc -m32 -c -O3 -w -idirafter "lib" lib/SDK/amx/*.h
g++ -m32 -c -O3 -w -idirafter "lib" -std=c++11 lib/SDK/*.cpp
g++ -m32 -c -O3 -w -idirafter "lib" -std=c++11 src/*.cpp
src/Main.cpp: In static member function \u2018static cell Plugin::n_regex_new(AMX*, cell* \u2019:
src/Main.cpp:94:16: error: \u2018ECMAScript\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option = syntax_option::ECMAScript;
^~~~~~~~~~~~~
src/Main.cpp:97:16: error: \u2018basic\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option = syntax_option::basic;
^~~~~~~~~~~~~
src/Main.cpp:100:16: error: \u2018extended\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option = syntax_option::extended;
^~~~~~~~~~~~~
src/Main.cpp:103:16: error: \u2018awk\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option = syntax_option::awk;
^~~~~~~~~~~~~
src/Main.cpp:106:16: error: \u2018grep\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option = syntax_option::grep;
^~~~~~~~~~~~~
src/Main.cpp:109:16: error: \u2018egrep\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option = syntax_option::egrep;
^~~~~~~~~~~~~
src/Main.cpp:114:16: error: \u2018icase\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option |= syntax_option::icase;
^~~~~~~~~~~~~
src/Main.cpp:116:16: error: \u2018nosubs\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option |= syntax_option::nosubs;
^~~~~~~~~~~~~
src/Main.cpp:118:16: error: \u2018optimize\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option |= syntax_option::optimize;
^~~~~~~~~~~~~
src/Main.cpp:120:16: error: \u2018collate\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option |= syntax_option::collate;
^~~~~~~~~~~~~
src/Main.cpp: In static member function \u2018static Plugin::match_flag Plugin::get_match_flag(E_MATCH_FLAG)\u2019:
src/Main.cpp:458:12: error: \u2018match_default\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_default;
^~~~~~~~~~
src/Main.cpp:460:12: error: \u2018match_not_bol\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_not_bol;
^~~~~~~~~~
src/Main.cpp:462:12: error: \u2018match_not_eol\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_not_eol;
^~~~~~~~~~
src/Main.cpp:464:12: error: \u2018match_not_bow\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_not_bow;
^~~~~~~~~~
src/Main.cpp:466:12: error: \u2018match_not_eow\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_not_eow;
^~~~~~~~~~
src/Main.cpp:468:12: error: \u2018match_any\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_any;
^~~~~~~~~~
src/Main.cpp:470:12: error: \u2018match_not_null\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_not_null;
^~~~~~~~~~
src/Main.cpp:472:12: error: \u2018match_continuous\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_continuous;
^~~~~~~~~~
src/Main.cpp:474:12: error: \u2018match_prev_avail\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_prev_avail;
^~~~~~~~~~
src/Main.cpp:476:12: error: \u2018format_sed\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::format_sed;
^~~~~~~~~~
src/Main.cpp:478:12: error: \u2018format_no_copy\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::format_no_copy;
^~~~~~~~~~
src/Main.cpp:480:12: error: \u2018format_first_only\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::format_first_only;
^~~~~~~~~~
make: *** [makefile:9: all] Error 1


P.S. Годный плагин, наверное единственный, который не будет крэшить. Как на счёт реализации gettext? :)

Daya
14.06.2016, 12:37
Ошибка при компиляции на Linux. Заменил syntax_option и match_flag на std::regex_constants, тогда скомпилировалось.


└─ $ gcc --version
gcc (GCC) 6.1.1 20160602
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.




gcc -m32 -c -O3 -w -idirafter "lib" lib/SDK/amx/*.h
g++ -m32 -c -O3 -w -idirafter "lib" -std=c++11 lib/SDK/*.cpp
g++ -m32 -c -O3 -w -idirafter "lib" -std=c++11 src/*.cpp
src/Main.cpp: In static member function \u2018static cell Plugin::n_regex_new(AMX*, cell* \u2019:
src/Main.cpp:94:16: error: \u2018ECMAScript\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option = syntax_option::ECMAScript;
^~~~~~~~~~~~~
src/Main.cpp:97:16: error: \u2018basic\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option = syntax_option::basic;
^~~~~~~~~~~~~
src/Main.cpp:100:16: error: \u2018extended\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option = syntax_option::extended;
^~~~~~~~~~~~~
src/Main.cpp:103:16: error: \u2018awk\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option = syntax_option::awk;
^~~~~~~~~~~~~
src/Main.cpp:106:16: error: \u2018grep\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option = syntax_option::grep;
^~~~~~~~~~~~~
src/Main.cpp:109:16: error: \u2018egrep\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option = syntax_option::egrep;
^~~~~~~~~~~~~
src/Main.cpp:114:16: error: \u2018icase\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option |= syntax_option::icase;
^~~~~~~~~~~~~
src/Main.cpp:116:16: error: \u2018nosubs\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option |= syntax_option::nosubs;
^~~~~~~~~~~~~
src/Main.cpp:118:16: error: \u2018optimize\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option |= syntax_option::optimize;
^~~~~~~~~~~~~
src/Main.cpp:120:16: error: \u2018collate\u2019 is not a member of \u2018Plugin::syntax_option {aka std::regex_constants::syntax_option_type}\u2019
option |= syntax_option::collate;
^~~~~~~~~~~~~
src/Main.cpp: In static member function \u2018static Plugin::match_flag Plugin::get_match_flag(E_MATCH_FLAG)\u2019:
src/Main.cpp:458:12: error: \u2018match_default\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_default;
^~~~~~~~~~
src/Main.cpp:460:12: error: \u2018match_not_bol\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_not_bol;
^~~~~~~~~~
src/Main.cpp:462:12: error: \u2018match_not_eol\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_not_eol;
^~~~~~~~~~
src/Main.cpp:464:12: error: \u2018match_not_bow\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_not_bow;
^~~~~~~~~~
src/Main.cpp:466:12: error: \u2018match_not_eow\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_not_eow;
^~~~~~~~~~
src/Main.cpp:468:12: error: \u2018match_any\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_any;
^~~~~~~~~~
src/Main.cpp:470:12: error: \u2018match_not_null\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_not_null;
^~~~~~~~~~
src/Main.cpp:472:12: error: \u2018match_continuous\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_continuous;
^~~~~~~~~~
src/Main.cpp:474:12: error: \u2018match_prev_avail\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::match_prev_avail;
^~~~~~~~~~
src/Main.cpp:476:12: error: \u2018format_sed\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::format_sed;
^~~~~~~~~~
src/Main.cpp:478:12: error: \u2018format_no_copy\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::format_no_copy;
^~~~~~~~~~
src/Main.cpp:480:12: error: \u2018format_first_only\u2019 is not a member of \u2018Plugin::match_flag {aka std::regex_constants::match_flag_type}\u2019
flag |= match_flag::format_first_only;
^~~~~~~~~~
make: *** [makefile:9: all] Error 1


P.S. Годный плагин, наверное единственный, который не будет крэшить. Как на счёт реализации gettext? :)

Ты тут покажи версия G++, тут же си++ а не обычный си чеовек, у мене все роаботает.

http://image.prntscr.com/image/c05b416412784bfd9397cd681d56b6ee.png
http://image.prntscr.com/image/c47cf425dc2947898ba8b43555278f61.png

urShadow
14.06.2016, 12:47
Успешно компилировал на этой версии:

g++ (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Как на счёт реализации gettext? :)
Функция match_get_group же. Подробнее в примере.

ziggi
14.06.2016, 13:08
Ты тут покажи версия G++, тут же си++ а не обычный си чеовек, у мене все роаботает.

http://image.prntscr.com/image/c05b416412784bfd9397cd681d56b6ee.png
http://image.prntscr.com/image/c47cf425dc2947898ba8b43555278f61.png

GCC уже давно не только Си, а g++ - это лишь GCC запущенный с параметром -lstdc++.

└─ $ g++ --version
g++ (GCC) 6.1.1 20160602
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Успешно компилировал на этой версии:

g++ (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Эта ветка датируется 2014 годом, моя собрана в этом месяце, видимо за это время прошло много изменений. Я не знаток C++, но если судить по этой странице (http://en.cppreference.com/w/cpp/header/regex), то все эти константы находятся как-раз в области видимости regex_constants. Да и ниже, в Class std::regex, показано то, как они объявляются:

static constexpr regex_constants::syntax_option_type
icase = regex_constants::icase;

То есть эти константы запрашивают именно из std::regex_constants, а не из std::regex_constants::syntax_option_type.
Поэтому то, что оно компилируется на 4.9 - это скорее ошибка компилятора, чем возможность языка.


Функция match_get_group же. Подробнее в примере.

Да не, я про реализацию GNU gettext в виде плагина, ибо для SA-MP'а ещё нет нормальных систем для создания мультиязычности.

urShadow
14.06.2016, 14:42
Благодарю, исправил.


Да не, я про реализацию GNU gettext в виде плагина, ибо для SA-MP'а ещё нет нормальных систем для создания мультиязычности.
Записал. В будущем может быть реализую.

vovandolg
14.06.2016, 14:49
Pawn.Regex - плагин,
Опять .so приписывать:dntknw:))

urShadow
14.06.2016, 14:57
Ты на название бинарника-то посмотри сначала.

urShadow
03.07.2016, 22:35
Обновлено до версии 1.1.

Salik_Davince
05.12.2016, 13:20
Очень хороший плагин вот только косяк какой-то там, запускается в Винде всё нормально(как и говорил в теме Вопросы) а в Debian он вообще не знает что творит, видимо что-то с нативками, лог при включении.[23:44:37] [debug] Run time error 19: "File or function is not found"
[23:44:37] [debug] regex_new
[23:44:37] [debug] regex_check
[23:44:37] [debug] regex_delete
[23:44:37] Script[gamemodes/Lights.amx]: Run time error 19: "File or function is not found"
[23:44:37] Number of vehicle models: 0
[23:44:37] [debug] Run time error 19: "File or function is not found"
[23:44:37] [debug] regex_new
[23:44:37] [debug] regex_check
[23:44:37] [debug] regex_delete
[23:44:37] [debug] Run time error 19: "File or function is not found"
[23:44:37] [debug] regex_new
[23:44:37] [debug] regex_check
[23:44:37] [debug] regex_delete
[23:44:37] [debug] Run time error 19: "File or function is not found"
[23:44:37] [debug] regex_new
[23:44:37] [debug] regex_check
[23:44:37] [debug] regex_delete
[23:44:37] [debug] Run time error 19: "File or function is not found"

DeimoS
05.12.2016, 14:43
Покажи полный лог

Salik_Davince
05.12.2016, 21:08
лог и состоит с этой рекурсии под спойлером выше, поставил старый regex сервер включился нормально но у него некоторые косяки и мало функционала которого мне нужно, c pawn.regex (1 или 1.1) версии та еще рекурсия с логом и не включением сервера.

DeimoS
05.12.2016, 21:20
лог и состоит с этой рекурсии под спойлером выше

Это не полный лог. Тут нет информации о подключаемых плагинах и прочем. Все экстрасенсы сейчас на ТНТ, так что гадать тут никто не будет

Salik_Davince
07.12.2016, 16:25
Я бы скинул(может быть и скину) логи просто я их удалил, а на машине где сервер запущен играют люди как то им не так уж будет если опять я подключу crashdetect(оффнув сервер и перезапустив его заного) и так они уже устали от этого всего но как будет время свободное сразу же скину логи.

$continue$
04.01.2017, 17:14
Как и описано выше: плагин запускается только под Windows. Если попробовать запустить под Linux (хостер). То сервер не запустится.

Логи:



[19:25:11] Server Plugins
[19:25:11] --------------
[19:25:11] Loading plugin: pawncmd.so
[19:25:11] Pawn.CMD plugin v3.1.2 by urShadow loaded
[19:25:11] Loaded.
[19:25:11] Loading plugin: mysql.so
[19:25:11] >> plugin.mysql: R41 successfully loaded.
[19:25:11] Loaded.
[19:25:11] Loading plugin: sscanf.so
[19:25:11]

[19:25:11] ===============================

[19:25:11] sscanf plugin loaded.

[19:25:11] Version: 2.8.2

[19:25:11] (c) 2012 Alex "Y_Less" Cole

[19:25:11] ===============================

[19:25:11] Loaded.
[19:25:11] Loading plugin: pawnregex.so
[19:25:11] Pawn.Regex plugin v1.1 by urShadow loaded
[19:25:11] Loaded.
[19:25:11] Loading plugin: crashdetect.so
[19:25:11] CrashDetect v4.17 is OK.
[19:25:11] Loaded.
[19:25:11] Loaded 5 plugins.
[19:25:11] Script[gamemodes/league.amx]: Run time error 19: "File or function is not found"
[19:25:11] Number of vehicle models: 0


P.S: Если убрать pawn.regex - сервер нормально запустится.
P.S.S: Сервер без плагинов (загруженный pawn.regex) - запускается нормально. Из чего следует, что плагин конфликтует с другими плагинами.

urShadow
09.07.2017, 21:21
Обновлено до 1.1.1.

- Исправлена ошибка "File or function is not found"

Redsan
31.07.2017, 23:02
Кто-нибудь запускал на linux'e последнюю версию?
P.S. У кого есть возможность, проверьте работоспособность.

Salik_Davince
31.07.2017, 23:26
Кто-нибудь запускал на linux'e последнюю версию?
P.S. У кого есть возможность, проверьте работоспособность.

Я и сейчас ею пользуюсь после фикса бага, работает отлично.

$continue$
10.08.2017, 02:10
кстати, говоря. в примерах не подключена библиотека a_samp, но используется printf. Хорошо бы было поправить =)

123
29.03.2018, 16:40
Я так понимаю, работать с плагином нужно по такому принципу?


stock IsValidEmail(email[])
{
if(!(4 <= strlen(email) <= 40))
return 0;

new Regex:r = Regex_New("|([a-z0-9_\\.\\-]{1,20})@([a-z0-9\\.\\-]{1,20})\\.([a-z]{2,4})|is");

new check = Regex_Check(email, r);

Regex_Delete(r);

return check;
}

В старом плагине Regex работать приходилось иначе.

Unreal
12.04.2018, 21:10
D:\Developing\new\gamemodes\new.pwn(49) : warning 234: function is deprecated (symbol "regex_new")
D:\Developing\new\gamemodes\new.pwn(50) : warning 234: function is deprecated (symbol "regex_check")
D:\Developing\new\gamemodes\new.pwn(51) : warning 234: function is deprecated (symbol "regex_delete")



#include <a_samp.inc>
#include <fixes.inc>
#include <streamer.inc>
#include <nex-ac.inc>
#include <Pawn.Regex>
#include <a_mysql.inc>
#include <sscanf2.inc>
#include <crashdetect.inc>
#include <foreach.inc>

enum _player {
name[MAX_PLAYER_NAME]
};
new player[MAX_PLAYERS][_player];

public OnPlayerConnect(playerid)
{
GetPlayerName(playerid, player[playerid][name], MAX_PLAYER_NAME);
new regex:r = regex_new("^([A-Z][a-z]+)\\_([A-Z][a-z]+)$");
regex_delete(r);
printf("%d ", regex_check(player[playerid][name], r));
return 1;
}

DeimoS
13.04.2018, 09:38
Если используешь компилятор от Zeex, то попробуй обновить его до последней версии. В одной из старых версий была такая проблема

Unreal
13.04.2018, 17:12
Если используешь компилятор от Zeex, то попробуй обновить его до последней версии. В одной из старых версий была такая проблема

До этого использовал pawno с коробки, теперь же обновил и перешел на vscode. Но не помогло
http://ihost.pro-pawn.ru/image.php?di=ZJKA

VVWVV
13.04.2018, 17:47
До этого использовал pawno с коробки, теперь же обновил и перешел на vscode. Но не помогло
http://ihost.pro-pawn.ru/image.php?di=ZJKA

Это из-за того, что прошлые наименования не подходили к общепринятой стилистике, поэтому они были помечены автором.
Изменения:

The code previously went against SA:MP naming conventions (see #1). This adds in the correct naming scheme while keeping (but deprecating) the old one without modifying the DLL. Also changes `regex:` to `Regex:` and `match_results:` to the less generic `RegexMatch:` (still don't like the `MATCH_DEFAULT` and similar symbols - nothing about that name indicates that it is part of the Regex system, increasing the likelihood of a naming collision). Those name changes however are mostly motivated by making the tags strong - case matters semantically in tags.

commit (https://github.com/urShadow/Pawn.Regex/pull/2/commits/2837f94424a9fd908c0ebddd85f2727559817982)
PR1 (https://github.com/urShadow/Pawn.Regex/issues/1)

Unreal
13.04.2018, 18:25
Это из-за того, что прошлые наименования не подходили к общепринятой стилистике, поэтому они были помечены автором.
Изменения:

commit (https://github.com/urShadow/Pawn.Regex/pull/2/commits/2837f94424a9fd908c0ebddd85f2727559817982)
PR1 (https://github.com/urShadow/Pawn.Regex/issues/1)

Спасибо, переименовал их на Regex_New, Regex_Delete и Regex_Check, результат: warning пропал.

ziggi
13.04.2018, 22:27
Спасибо, переименовал их на Regex_New, Regex_Delete и Regex_Check, результат: заработало.

Оно и так у тебя должно было работать, это же просто warning, то есть предупреждение.

Unreal
13.04.2018, 22:38
Оно и так у тебя должно было работать, это же просто warning, то есть предупреждение.

Да, работало. А теперь заработало без warningга. Исправил текст выше.

Salik_Davince
06.04.2019, 19:25
С чего tag mismatch варнинги не пойму.


stock IsRPNickName(nickname[])
{
new regex:r = Regex_New("[A-Z][a-z]+_[A-Z][a-z]+");

new check = Regex_Check(nickname, r);

Regex_Delete(r);

return check;
}


Warning (идет на все нативные функции Regex_*) -


warning 213: tag mismatch

DeimoS
07.04.2019, 07:29
stock IsRPNickName(const nickname[])
{
new Regex:r = Regex_New("[A-Z][a-z]+_[A-Z][a-z]+");

new check = Regex_Check(nickname, r);

Regex_Delete(r);

return check;
}

DeimoS
10.10.2019, 00:36
Какие гайки требуется крутить, чтоб заставить плагин работать с символьным классом "\b"?

vvw
10.10.2019, 10:42
Какие гайки требуется крутить, чтоб заставить плагин работать с символьным классом "\b"?

Даже так не работает? "\\b"

DeimoS
10.10.2019, 11:57
Даже так не работает? "\\b"

Да. Естественно я экранировал бекслеш в выражении. Тут написал без экранирования для наглядности.

Вот самый простой пример:
new Regex:r,
RegexMatch:m,
pos;
r = Regex_New("\\b(слово)\\b");
printf("%d", Regex_Search("слово словоблудие слово", r, m, pos));
Regex_Delete(r);

tnc
10.10.2019, 14:07
Причем не работает это только с русскими символами. И это не проблема плагина. Т.к: из программы на C++ оно тоже не маттчит пример, который выше.

UPDATE: нужен флаг с unicode.

DeimoS
10.10.2019, 14:44
Да, забыл написать про это. По идее, всё должно было решаться добавлением флага "u" в выражение, но оно не работает.

Если что, пока что наколхозил подобное решение
(?:^|\\s)(слово)(?:$|\\s)
Просто хочется узнать, это я криворукий и не нашёл нужную настройку или в плагине просто не реализован нужный функционал

UPD: Собственно, даже флаг "REGEX_ICASE" не работает для кириллицы. Надо будет покопаться под капотом плагина.

tnc
10.10.2019, 15:38
\u - так просто не будет работать. Я так и не нашел метод, которым в std можно задать флаг unicode, а вот в boost есть: u16regex.

Да, забыл написать про это. По идее, всё должно было решаться добавлением флага "u" в выражение, но оно не работает.

Если что, пока что наколхозил подобное решение
(?:^|\\s)(слово)(?:$|\\s)
Просто хочется узнать, это я криворукий и не нашёл нужную настройку или в плагине просто не реализован нужный функционал

UPD: Собственно, даже флаг "REGEX_ICASE" не работает для кириллицы. Надо будет покопаться под капотом плагина.

vvw
10.10.2019, 17:16
Да, забыл написать про это. По идее, всё должно было решаться добавлением флага "u" в выражение, но оно не работает.

Если что, пока что наколхозил подобное решение
(?:^|\\s)(слово)(?:$|\\s)
Просто хочется узнать, это я криворукий и не нашёл нужную настройку или в плагине просто не реализован нужный функционал

UPD: Собственно, даже флаг "REGEX_ICASE" не работает для кириллицы. Надо будет покопаться под капотом плагина.

Использовал REGEX_COLLATE?

DeimoS
10.10.2019, 17:45
Использовал REGEX_COLLATE?

Да. Я даже чуть ли не перебором пробовал настройки применять, думая, что может я чего-то просто не так понимаю. Надо будет выделить время и в плагине покопаться. Думаю, вопросы все решатся тогда.

Unreal
04.04.2020, 00:25
Хотел реализовать проверку валидности Эл. почты. Сделал так

[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z]+

Правильно ли?

tnc
04.04.2020, 00:54
Хотел реализовать проверку валидности Эл. почты. Сделал так

[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z]+

Правильно ли?

Проверять валидность почты через регексы - сумасшествие (https://habr.com/ru/post/175375/). Куда лучше отправлять код на почту, чтобы понять, что ввели валидный адрес.

Nexius_Tailer
04.04.2020, 03:26
Проверять валидность почты через регексы - сумасшествие (https://habr.com/ru/post/175375/). Куда лучше отправлять код на почту, чтобы понять, что ввели валидный адрес.
Какая-то базовая проверка на ввод полной чуши всё равно должна быть.