Просмотр полной версии : [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(®ex: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
Хорошая программа, спасибо скача:smile:
Ошибка при компиляции на 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? :)
Ошибка при компиляции на 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 же. Подробнее в примере.
Ты тут покажи версия 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"
Salik_Davince
05.12.2016, 21:08
лог и состоит с этой рекурсии под спойлером выше, поставил старый regex сервер включился нормально но у него некоторые косяки и мало функционала которого мне нужно, c pawn.regex (1 или 1.1) версии та еще рекурсия с логом и не включением сервера.
лог и состоит с этой рекурсии под спойлером выше
Это не полный лог. Тут нет информации о подключаемых плагинах и прочем. Все экстрасенсы сейчас на ТНТ, так что гадать тут никто не будет
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"
Кто-нибудь запускал на linux'e последнюю версию?
P.S. У кого есть возможность, проверьте работоспособность.
Salik_Davince
31.07.2017, 23:26
Кто-нибудь запускал на linux'e последнюю версию?
P.S. У кого есть возможность, проверьте работоспособность.
Я и сейчас ею пользуюсь после фикса бага, работает отлично.
$continue$
10.08.2017, 02:10
кстати, говоря. в примерах не подключена библиотека a_samp, но используется printf. Хорошо бы было поправить =)
Я так понимаю, работать с плагином нужно по такому принципу?
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 работать приходилось иначе.
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;
}
Если используешь компилятор от Zeex, то попробуй обновить его до последней версии. В одной из старых версий была такая проблема
Если используешь компилятор от Zeex, то попробуй обновить его до последней версии. В одной из старых версий была такая проблема
До этого использовал pawno с коробки, теперь же обновил и перешел на vscode. Но не помогло
http://ihost.pro-pawn.ru/image.php?di=ZJKA
До этого использовал 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)
Это из-за того, что прошлые наименования не подходили к общепринятой стилистике, поэтому они были помечены автором.
Изменения:
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 пропал.
Спасибо, переименовал их на Regex_New, Regex_Delete и Regex_Check, результат: заработало.
Оно и так у тебя должно было работать, это же просто warning, то есть предупреждение.
Оно и так у тебя должно было работать, это же просто 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
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;
}
Какие гайки требуется крутить, чтоб заставить плагин работать с символьным классом "\b"?
Какие гайки требуется крутить, чтоб заставить плагин работать с символьным классом "\b"?
Даже так не работает? "\\b"
Даже так не работает? "\\b"
Да. Естественно я экранировал бекслеш в выражении. Тут написал без экранирования для наглядности.
Вот самый простой пример:
new Regex:r,
RegexMatch:m,
pos;
r = Regex_New("\\b(слово)\\b");
printf("%d", Regex_Search("слово словоблудие слово", r, m, pos));
Regex_Delete(r);
Причем не работает это только с русскими символами. И это не проблема плагина. Т.к: из программы на C++ оно тоже не маттчит пример, который выше.
UPDATE: нужен флаг с unicode.
Да, забыл написать про это. По идее, всё должно было решаться добавлением флага "u" в выражение, но оно не работает.
Если что, пока что наколхозил подобное решение
(?:^|\\s)(слово)(?:$|\\s)
Просто хочется узнать, это я криворукий и не нашёл нужную настройку или в плагине просто не реализован нужный функционал
UPD: Собственно, даже флаг "REGEX_ICASE" не работает для кириллицы. Надо будет покопаться под капотом плагина.
\u - так просто не будет работать. Я так и не нашел метод, которым в std можно задать флаг unicode, а вот в boost есть: u16regex.
Да, забыл написать про это. По идее, всё должно было решаться добавлением флага "u" в выражение, но оно не работает.
Если что, пока что наколхозил подобное решение
(?:^|\\s)(слово)(?:$|\\s)
Просто хочется узнать, это я криворукий и не нашёл нужную настройку или в плагине просто не реализован нужный функционал
UPD: Собственно, даже флаг "REGEX_ICASE" не работает для кириллицы. Надо будет покопаться под капотом плагина.
Да, забыл написать про это. По идее, всё должно было решаться добавлением флага "u" в выражение, но оно не работает.
Если что, пока что наколхозил подобное решение
(?:^|\\s)(слово)(?:$|\\s)
Просто хочется узнать, это я криворукий и не нашёл нужную настройку или в плагине просто не реализован нужный функционал
UPD: Собственно, даже флаг "REGEX_ICASE" не работает для кириллицы. Надо будет покопаться под капотом плагина.
Использовал REGEX_COLLATE?
Использовал REGEX_COLLATE?
Да. Я даже чуть ли не перебором пробовал настройки применять, думая, что может я чего-то просто не так понимаю. Надо будет выделить время и в плагине покопаться. Думаю, вопросы все решатся тогда.
Хотел реализовать проверку валидности Эл. почты. Сделал так
[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z]+
Правильно ли?
Хотел реализовать проверку валидности Эл. почты. Сделал так
[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/). Куда лучше отправлять код на почту, чтобы понять, что ввели валидный адрес.
Какая-то базовая проверка на ввод полной чуши всё равно должна быть.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot