Декораторы перед функциями и операторами @ и тд.

Сообщения
61
Реакции
2
Предупреждения
21
Есть ли разница между ?
Код:
register_clcmd("cmd","@function")

@function(id)
{
    //code
}
и
Код:
register_clcmd("cmd","function")
public function(id)
{
    //code
}

Нигде мануалов по этой теме не вижу в документациях. В amxx 1.8.2 @ Перед названиями не встречала, в 1.9 все юзают. Так где почитать ? а то я на сайте не нашла.
И не обладает ли таким свойством как в питоне ?
@ - означает что во время выполнения, эта функция не может показывать ошибки. Использование не рекоммендуется в большинстве случаев.

А также в changelog https://dev-cs.ru/resources/405/update/1012/ есть строка: (g/s)et_user_hitzones() functions weren't generating properly in the API due to a whitespace in front of the comment blocks. @return for give item() was missing Что означает @ перед retern ?
 
Сообщения
1,570
Реакции
652
Помог
5 раз(а)
Публики можно найти через get_func_id вроде как для вызова из чужих плагинов

Например у меня в меню так реализовано https://github.com/UnrealKaraulov/u...170be4fd5115f2678c9a5038/unreal_menu.sma#L158

(типа меню кроме стандартного функционала так же позволяет вызывать из чужих плагинов функции)

Если они публики
 
Последнее редактирование:
Сообщения
61
Реакции
2
Предупреждения
21
Публики можно найти через get_func_id вроде как для вызова из чужих плагинов

Например у меня в меню так реализовано https://github.com/UnrealKaraulov/u...170be4fd5115f2678c9a5038/unreal_menu.sma#L158

(типа меню кроме стандартного функционала так же позволяет вызывать из чужих плагинов функции)

Если они публики
Вопрос был про декораторы @ что это ? и про разницу в объявлении функции и её вызове. Есть ли разница использовать public или @ ? Про вызов публичных функций в других плагинов посредством callfunc_begin мне известно, я сама пользуюсь этими функциями где нужно.
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
434
Реакции
296
Помог
5 раз(а)
@ не делает ничего кроме публичности функции.

Код:
public a() {
    
}

@a() {

}
->
Код:
CODE    ; 0
;program exit point
    halt 0
    
    proc    ; a
    break    ; c
    zero.pri
    retn

    proc    ; @a
    break    ; 1c
    zero.pri
    retn


STKSIZE 1000
На выходе абсолюнто одинаковый код на асм, разница только в том, что @ включается в название функции.
19 Ноя 2024
И в коде компиляхтора ровно так это и описано
19 Ноя 2024
И, судя по всему, это работает вообще на всё, что можно обьявить в глобальном скопе (ну по сути только функи + переменные)
 
Сообщения
372
Реакции
47
Помог
6 раз(а)
@ - означает что во время выполнения, эта функция не может показывать ошибки. Использование не рекоммендуется в большинстве случаев.
шта?))

Python:
def message(func):
    def wrapper(message: str, *args, **kwargs):
        if len(message) > 5:
            print(f"Валидное сообщение: {message}")
            return func(message, *args, **kwargs)
        else:
            print(f"Недопустимое сообщение")

    return wrapper

@message
def send_msg(msg: str):
    print(f"Отправка сообщения: {msg}")

send_msg("Привет мир!")
простейший пример написания декоратора на python, почитайте про декораторы
 
Сообщения
660
Реакции
563
Предупреждения
8
Помог
9 раз(а)
Использование @ это для тупых деградантов.
 
Сообщения
500
Реакции
275
Помог
6 раз(а)
Моду на @ fl0wer ввёл) Потом после него уже другие подхватывать начали
 
Сообщения
660
Реакции
563
Предупреждения
8
Помог
9 раз(а)
CHEL74, Просто меня бесят когда копируют без понимания. И бесит еще что многие программы не видят в списке функций эти дурацкие @ как функция.
 
Сообщения
1,700
Реакции
1,512
Помог
26 раз(а)
Vaqtincha, если уже набесился, то аргументируй про понимание, чего там такого сокрально, что знаешь только ты? А программы не видят из-за того, что кривые, их нужно фиксить.
 
Сообщения
61
Реакции
2
Предупреждения
21
шта?))

Python:
def message(func):
    def wrapper(message: str, *args, **kwargs):
        if len(message) > 5:
            print(f"Валидное сообщение: {message}")
            return func(message, *args, **kwargs)
        else:
            print(f"Недопустимое сообщение")

    return wrapper

@message
def send_msg(msg: str):
    print(f"Отправка сообщения: {msg}")

send_msg("Привет мир!")
простейший пример написания декоратора на python, почитайте про декораторы
Я прочитала про @ где то в мейл ответах, просто не помню точную ссылку, там про питон писалось. Так что возможны привела не корректный пример, доверившись нонейм гуру. Простите.
19 Ноя 2024
fl0wer, Я вот работаю в AMXX Studio , мне хватает и удобно. Кто то прикручивает к Visual Code или Вижл студии и другим средам разработки, кто то для нотепада++ с плагинами пишет, на вкус и цвет. Но скажу так , когда стиль и правила меняются просто потому что кому то скучно мне это не нравится. Я люблю стабильность и тривиальность. Лучше 1 раз подумать при разработке компилятора чтоб всем было удобно, и потом им пользоваться. Вот например языки семейства Си очень консеративны и добавляют изменения очень вымеренно со временем, оставляя обратную совместимость. и Amxx Pawn был до версии 1.8.2 очень консервативным, пока не пришли Русские молодые мажоры, которые решили впихнуть туда всё для выпендрёжа. (но это ментальность у нас такая, любим вычурненность и вульгарность, ибо мало чем другим блеснуть можем.) Мне современный код на 1.9 с 3мя слоями обёрток функций (аля чтобы компактно) противен, выглядит как Какой нить Венгерский язык (кстати венгерская нотация и верблюжий код мне нравится, сама ему следую). Противно читать современный код плагинов на 1.9 потому что из за компактности, сложнее дебажить, ибо читаемость кода низкая. а уж про выпендрёж со стоками, дабы урезать пару строк кода в функции, создают проблемы читабельности кода. а это выливается в потери времени при отладке. Спасибо.
 
Сообщения
660
Реакции
563
Предупреждения
8
Помог
9 раз(а)
Ненормативная лексика, завуалированный мат
fl0wer, а нафиг это надо? Пусть дольше юзают public и не ебите мозги.
 
Сообщения
372
Реакции
47
Помог
6 раз(а)
я не знаю с чем это связано, но, при:
Код:
#include <amxmodx>
#include <hamsandwich>

public plugin_init()
{
    RegisterHam(Ham_TakeDamage, "player", "TakeDamage", 1)
}

public TakeDamage(victim, inflictor, attacker, Float:damage, damageType)
{
    if (is_user_bot(victim) && !is_user_alive(victim))
        return HAM_IGNORED

    new Float:flDamage = damage * 0.5

    client_print(victim, print_chat, "Вы получили урон: %.2f (снижено до %.2f)", damage, flDamage)

    SetHamParamFloat(4, flDamage)

    return HAM_HANDLED
}
в чат выводит корректно, в то время как с @TakeDamage(victim, inflictor, attacker, Float:damage, damageType) не выводило...
 
Сообщения
1,570
Реакции
652
Помог
5 раз(а)
Я вроде как не использовал никогда @, только если случайно своровал чужой код и забыл убрать @))) тоже кажется что чепуха нечитаемая выходит, а если ещё и скорость работы не увеличивает добавление @ то вообще нет смысла использовать.
19 Ноя 2024
DEVV, может без публика функцию не может найти, в названии ведь @ добавляется
 
Сообщения
137
Реакции
23
Помог
2 раз(а)
DEVV

C++:
-RegisterHam(Ham_TakeDamage, "player", "TakeDamage", 1)
+RegisterHam(Ham_TakeDamage, "player", "@TakeDamage", 1)

@TakeDamage(victim, inflictor, attacker, Float:damage, damageType)
 
Сообщения
2,751
Реакции
3,016
Помог
61 раз(а)
Нигде мануалов по этой теме не вижу в документациях
from doc/Pawn_Language_Guide.pdf

Public declarations
Global “simple” variables (no arrays) may be declared “public” in two ways:
  • ⋄ declare the variable using the keyword public instead of var;
  • ⋄ start the variable name with the “@” symbol.
Public variables behave like global variables, with the addition that the host program can also read and write public variables. A (normal) global variable can only be accessed by the functions in your script —the host program is unaware of them. As such, a host program may require that you declare a variable with a specific name as “public” for special purposes —such as the most recent error number, or the general program state.
Я прочитала про @ где то
читать лучше всего всегда в первоисточнике, которым является ITB CompuPhase Pawn Language

1732037482724.png
 

Download all Attachments

Сообщения
212
Реакции
334
Помог
3 раз(а)
не увеличивает добавление @ то вообще нет смысла использовать.
есть смысл покуда это сокращает количество символов для написания

пока не пришли Русские молодые мажоры, которые решили впихнуть туда всё для выпендрёжа
можно вот этот момент поподробнее: кто конкретно пришел, кто что впихнул и как это относится к сабжу?

Мне современный код на 1.9 с 3мя слоями обёрток функций (аля чтобы компактно) противен
здесь тоже нужен пример трех слов обёрток функций и почему это плохо

Amxx Pawn был до версии 1.8.2
расскажи, пожалуйста, что в языке после версии 1.8.3 повлияло на его "консервативность"? Я не считаю, например, ограничение в 31 символ для имен функций чем-то консервативным, а снятием глупого ограничения
 
Сообщения
61
Реакции
2
Предупреждения
21
Xelson,
есть смысл покуда это сокращает количество символов для написания


можно вот этот момент поподробнее: кто конкретно пришел, кто что впихнул и как это относится к сабжу?


здесь тоже нужен пример трех слов обёрток функций и почему это плохо


расскажи, пожалуйста, что в языке после версии 1.8.3 повлияло на его "консервативность"? Я не считаю, например, ограничение в 31 символ для имен функций чем-то консервативным, а снятием глупого ограничения
В 1.8.2 код выглядет
Код:
/* AMX Mod X Script
*
*    "Killa HP"
*    (c) jas0n, november 2007
*
*    This file is provided as is (no warranties)   
*
*Перевод на русский выполнен (translated into russian by) Reg0 (icq: 7798098)
*ss       
*/

#include <amxmodx>
#include <cstrike>

new const PLUGIN[] = "Killa HP"
new const VERSION[] = "1.0"
new const AUTHOR[] = "jas0n"

#define MAX_MSG_LENGTH 255
#define MAX_NAME_LENGTH 32

new const g_msgTemplate[] = "^x04Вас убил ^x03%s ^x01, у него осталось ^x04%d^x01 HP и ^x04%d^x01 AP"

new g_msgSayText

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_event("DeathMsg", "eventDeath", "a", "1>0")
    g_msgSayText = get_user_msgid("SayText")
}

public eventDeath()
{
    static aID, vID, vTeam
    static aName[MAX_NAME_LENGTH+1]
    static msgText[MAX_MSG_LENGTH+1]
    static aHealth, aArmor, aFrags
    static CsArmorType:ArmorType
    
    aID = read_data(1)
    vID = read_data(2)
    
    vTeam = get_user_team(vID)
    if (vTeam < 1 || vTeam > 2)
    {
        return
    }
    
    if (!is_user_connected(vID) || is_user_alive(vID) || vID == aID)
    {
        return
    }
    
    get_user_name(aID, aName, MAX_NAME_LENGTH)
    aHealth = get_user_health(aID)
    aArmor = cs_get_user_armor(aID, ArmorType)
    aFrags = get_user_frags(aID)
        
    formatex(msgText, MAX_MSG_LENGTH, g_msgTemplate, aName, aHealth, aArmor, aFrags)
    
    msgSayText(vID, msgText)
}

msgSayText(id, message[])
{
    message_begin(MSG_ONE, g_msgSayText, _, id)
    write_byte(id)       
    write_string(message)
    message_end()
}

в 1.9 выглядит
Код:
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
//     https://alliedmods.net/amxmodx-license

#include <amxmodx>
#include <regex>

/**
 * Warning: To get expected result, file encoding must be UTF-8 without BOM.
 */

public plugin_init()
{
    register_plugin("Regex Test", AMXX_VERSION_STR, "AMXX Dev Team");
    register_srvcmd("regex_test", "OnServerCommand");
}

new FailedCount;
new PassedCount;

test(const regex[], const replace[], const string[], const expectedString[], expectedCount = -1, regexFlags = 0, formatFlags = 0, bufferlen = -1)
{
    new errorCode, error[128];
    new Regex:r = regex_compile_ex(regex, regexFlags, error, charsmax(error), errorCode);

    if (r == REGEX_PATTERN_FAIL || errorCode)
    {
        server_print("^t^t#%d. Pattern fail : ^"%s^"(%d)", ++FailedCount + PassedCount, error, errorCode);
    }
    else
    {
        new buffer[512];
        copy(buffer, charsmax(buffer), string);

        new errorCode;
        new count = regex_replace(r, buffer, bufferlen != -1 ?  bufferlen : charsmax(buffer), replace, formatFlags, errorCode);

        if (expectedCount != -1 && count != expectedCount)
        {
            server_print("^t^t#%d. Failed - count = %d, expected count = %d", ++FailedCount + PassedCount, count, expectedCount);
        }
        else if (!equal(buffer, expectedString))
        {
            server_print("^t^t#%d. Failed - output = %s, expected output = %s", ++FailedCount + PassedCount, buffer, expectedString);
        }
        else
        {
            ++PassedCount;
        }

        regex_free(r);
    }
}
end()
{
    server_print("Tests successful: %d/%d", PassedCount, PassedCount + FailedCount);
}

public OnServerCommand()
{
    server_print("Testing regex_replace()");

    server_print("^tChecking count...");
    {
        test( .regex          = "(([0-9a-z]+)-([0-9]+))-(([0-9]+)-([0-9]+))",
              .replace        = "xxxx",
              .string         = "1-2-3-4 a-2-3-4 1-a-3-4 1-2-a-4 1-2-3-a a-a-a-a 4-3-2-1 100-200-300-400-500-600-700-800",
              .expectedString = "xxxx xxxx 1-a-3-4 1-2-a-4 1-2-3-a a-a-a-a xxxx xxxx-xxxx",
              .expectedCount  = 5
            );

        test( .regex          = "([a-z]+)",
              .replace        = "xxxx",
              .string         = "Here must only number like 42 and 13 appear",
              .expectedString = "Hxxxx xxxx xxxx xxxx xxxx 42 xxxx 13 xxxx",
              .expectedCount  = 7
            );

        test( .regex          = "((V(I|1)(4|A)GR(4|A))|(V(I|1)C(0|O)D(I|1)(N|\/\\\/)))", .regexFlags = PCRE_CASELESS,
              .replace        = "...",
              .string         = "Viagra V14GR4 Vicodin V1C0D1/\/ v1c0d1/|/",
              .expectedString = "... ... ... ... v1c0d1/|/",
              .expectedCount  = 4
            );

        test( .regex          = "\[(right)\](((?R)|[^^[]+?|\[)*)\[/\\1\]", .regexFlags = PCRE_CASELESS | PCRE_UNGREEDY,
              .replace        = "",
              .string         = "[CODE]&lt;td align=&quot;$stylevar[right]&quot;&gt;
",
.expectedString = "
Код:
&lt;td align=&quot;$stylevar[right]&quot;&gt;
",
.expectedCount = 0
);

test( .regex = "- This is a string$",
.replace = "This shouldn\'t work",
.string = "123456789 - Hello, world - This is a string.",
.expectedString = "123456789 - Hello, world - This is a string.",
.expectedCount = 0
);

test( .regex = "[0-35-9]",
.replace = "4",
.string = "123456789 - Hello, world - This is a string.",
.expectedString = "444444444 - Hello, world - This is a string.",
.expectedCount = 8
);

test( .regex = "\b[hH]\w{2,4}",
.replace = "Bonjour",
.string = "123456789 - Hello, world - This is a string.",
.expectedString = "123456789 - Bonjour, world - This is a string.",
.expectedCount = 1
);

test( .regex = "(\w)\s*-\s*(\w)",
.replace = "$1. $2",
.string = "123456789 - Hello, world - This is a string.",
.expectedString = "123456789. Hello, world. This is a string.",
.expectedCount = 2
);

test( .regex = "([a-z]\w+)@(\w+)\.(\w+)\.([a-z]{2,})",
.replace = "$1 at $2 dot $3 dot $4",
.string = "[email protected]",
.expectedString = "josmessa at uk dot ibm dot com",
.expectedCount = 1
);

test( .regex = "\b\w{1}s",
.replace = "test",
.string = "This is a string. (0-9) as well as parentheses",
.expectedString = "This test a string. (0-9) test well test parentheses",
.expectedCount = 3
);


test( .regex = "(\d{1})-(\d{1})",
.replace = "$1 to $2",
.string = "This is a string. It contains numbers (0-9) as well as parentheses and some other things!",
.expectedString = "This is a string. It contains numbers (0 to 9) as well as parentheses and some other things!",
.expectedCount = 1
);

test( .regex = "[\(!\)]",
.replace = "*",
.string = "This is a string. It contains numbers (0-9) as well as parentheses and some other things!",
.expectedString = "This is a string. It contains numbers 0-9 as well as parentheses and some other things*",
.expectedCount = 3
);
}

server_print("^tChecking edges cases...");
{
test(.regex = "[0-9]+", .replace = "*", .string = "", .expectedString = "", .expectedCount = 0);
test(.regex = "([0-9]+)", .replace = "", .string = "123", .expectedString = "", .expectedCount = 1);
test(.regex = "a", .replace = "\", .string = "a", .expectedString = "\", .expectedCount = 1);
test(.regex = "^^", .replace = "x", .string = "a", .expectedString = "xa", .expectedCount = 1);
test(.regex = "b", .replace = "\", .string = "b", .expectedString = "\", .expectedCount = 1, .bufferlen = 1);
test(.regex = "b", .replace = "^^", .string = "b", .expectedString = "b", .expectedCount = 0, .bufferlen = 0);
test(.regex = "\w+", .replace = "123", .string = "abc", .expectedString = "12", .expectedCount = 1, .bufferlen = 2);
}

server_print("^tChecking UTF-8 support...");
{
test(.regex = "(\w+)", .replace = "*", .string = "éà@É", .expectedString = "éà@É", .expectedCount = 0);
test(.regex = "(\w+)", .replace = "", .string = "éà@É", .expectedString = "@*", .expectedCount = 2, .regexFlags = PCRE_UCP | PCRE_UTF8);
test(.regex = "(\w+)", .replace = "字", .string = "éà@É", .expectedString = "字@字",.expectedCount = 2, .regexFlags = PCRE_UCP | PCRE_UTF8);
test(.regex = "(\w+)", .replace = "字", .string = "éà@É", .expectedString = "字", .expectedCount = 2, .regexFlags = PCRE_UCP | PCRE_UTF8, .bufferlen = 3);
}

server_print("^tChecking substitutions...");
{
test(.regex = "x", .replace = "y", .string = "text", .expectedString = "teyt" );
test(.regex = "x", .replace = "$", .string = "text", .expectedString = "te$t" );
test(.regex = "x", .replace = "$1", .string = "text", .expectedString = "te$1t" );
test(.regex = "x", .replace = "${1", .string = "text", .expectedString = "te${1t" );
test(.regex = "x", .replace = "${", .string = "text", .expectedString = "te${t" );
test(.regex = "x", .replace = "${$0", .string = "text", .expectedString = "te${xt" );
test(.regex = "x", .replace = "${1}", .string = "text", .expectedString = "te${1}t" );
test(.regex = "x", .replace = "${1}", .string = "text", .expectedString = "te${1}t" );
test(.regex = "x", .replace = "$5", .string = "text", .expectedString = "te$5t" );
test(.regex = "x", .replace = "$5", .string = "te(x)t", .expectedString = "te($5)t" );
test(.regex = "x", .replace = "${foo", .string = "text", .expectedString = "te${foot" );
test(.regex = "(x)", .replace = "$5", .string = "text", .expectedString = "te$5t" );
test(.regex = "(x)", .replace = "$1", .string = "text", .expectedString = "text" );
test(.regex = "e(x)", .replace = "$1", .string = "text", .expectedString = "txt" );
test(.regex = "e(x)", .replace = "$5", .string = "text", .expectedString = "t$5t" );
test(.regex = "e(x)", .replace = "$4", .string = "text", .expectedString = "t$4t" );
test(.regex = "e(x)", .replace = "$3", .string = "text", .expectedString = "t$3t" );
test(.regex = "e(x)", .replace = "${1}", .string = "text", .expectedString = "txt" );
test(.regex = "e(x)", .replace = "${3}", .string = "text", .expectedString = "t${3}t" );
test(.regex = "e(x)", .replace = "${1}${3}", .string = "text", .expectedString = "tx${3}t" );
test(.regex = "e(x)", .replace = "${1}${name}", .string = "text", .expectedString = "tx${name}t");
test(.regex = "e(?<foo>x)", .replace = "${1}${name}", .string = "text", .expectedString = "tx${name}t");
test(.regex = "e(?<foo>x)", .replace = "${1}${foo}", .string = "text", .expectedString = "txxt" );
test(.regex = "e(?<foo>x)", .replace = "${goll}${foo}", .string = "text", .expectedString = "t${goll}xt");
test(.regex = "e(?<foo>x)", .replace = "${goll${foo}", .string = "text", .expectedString = "t${gollxt" );
test(.regex = "e(?<foo>x)", .replace = "${goll${foo}}", .string = "text", .expectedString = "t${gollx}t");
test(.regex = "e(?<foo>x)", .replace = "$${foo}}", .string = "text", .expectedString = "t${foo}}t" );
test(.regex = "e(?<foo>x)", .replace = "${${foo}}", .string = "text", .expectedString = "t${x}t" );
test(.regex = "e(?<foo>x)", .replace = "$${foo}}", .string = "text", .expectedString = "t${foo}}t" );
test(.regex = "e(?<foo>x)", .replace = "$${bfoo}}", .string = "text", .expectedString = "t${bfoo}}t");
test(.regex = "e(?<foo>x)", .replace = "$${foo}}", .string = "text", .expectedString = "t${foo}}t" );
test(.regex = "e(?<foo>x)", .replace = "$${foo}", .string = "text", .expectedString = "t${foo}t" );
test(.regex = "e(?<foo>x)", .replace = "$$", .string = "text", .expectedString = "t$t" );
test(.regex = "(e)(?<foo>x)", .replace = "${foo}$1$2", .string = "text", .expectedString = "txext" );
test(.regex = "(?<foo>e)(x)", .replace = "${foo}$1$2", .string = "text", .expectedString = "teext" );
test(.regex = "(e)(?<foo>x)", .replace = "${foo}$1$2$+", .string = "text", .expectedString = "txexxt" );
test(.regex = "(?<foo>e)(x)", .replace = "${foo}$1$2$+", .string = "text", .expectedString = "teexxt" );
test(.regex = "(?<foo>e)(x)", .replace = "${foo}$1$2$_", .string = "texts", .expectedString = "teextextsts");
test(.regex = "(?<foo>e)(x)", .replace = "${foo}$1$2$`", .string = "texts", .expectedString = "teextts" ),
test(.regex = "(?<foo>e)(x)", .replace = "${foo}$1$2$'", .string = "texts", .expectedString = "teextsts" ),
test(.regex = "(?<foo>e)(x)", .replace = "${foo}$1$2$&", .string = "texts", .expectedString = "teexexts" ),
test(.regex = "x", .replace = "y", .string = "text", .expectedString = "teyt" );
test(.regex = "x", .replace = "$", .string = "text", .expectedString = "te$t" );
test(.regex = "x", .replace = "$1", .string = "text", .expectedString = "te$1t" );
test(.regex = "x", .replace = "${1}", .string = "text", .expectedString = "te${1}t" );
test(.regex = "x", .replace = "$5", .string = "text", .expectedString = "te$5t" );
test(.regex = "x", .replace = "$5", .string = "te(x)t", .expectedString = "te($5)t" );
test(.regex = "x", .replace = "${foo", .string = "text", .expectedString = "te${foot" );
test(.regex = "(x)", .replace = "$5", .string = "text", .expectedString = "te$5t" );
test(.regex = "(x)", .replace = "$1", .string = "text", .expectedString = "text" );
test(.regex = "e(x)", .replace = "$1", .string = "text", .expectedString = "txt" );
test(.regex = "e(x)", .replace = "$5", .string = "text", .expectedString = "t$5t" );
test(.regex = "e(x)", .replace = "$4", .string = "text", .expectedString = "t$4t" );
test(.regex = "e(x)", .replace = "$3", .string = "text", .expectedString = "t$3t" );
test(.regex = "e(x)", .replace = "${1}", .string = "text", .expectedString = "txt" );
test(.regex = "e(x)", .replace = "${3}", .string = "text", .expectedString = "t${3}t" );
test(.regex = "e(x)", .replace = "${1}${3}", .string = "text", .expectedString = "tx${3}t" );
test(.regex = "e(x)", .replace = "${1}${name}", .string = "text", .expectedString = "tx${name}t");
test(.regex = "e(?<foo>x)", .replace = "${1}${name}", .string = "text", .expectedString = "tx${name}t");
test(.regex = "e(?<foo>x)", .replace = "${1}${foo}", .string = "text", .expectedString = "txxt" );
test(.regex = "e(?<foo>x)", .replace = "${goll}${foo}", .string = "text", .expectedString = "t${goll}xt");
test(.regex = "e(?<foo>x)", .replace = "${goll${foo}", .string = "text", .expectedString = "t${gollxt" );
test(.regex = "e(?<foo>x)", .replace = "${goll${foo}}", .string = "text", .expectedString = "t${gollx}t");
test(.regex = "e(?<foo>x)", .replace = "$${foo}}", .string = "text", .expectedString = "t${foo}}t" );
test(.regex = "e(?<foo>x)", .replace = "${${foo}}", .string = "text", .expectedString = "t${x}t" );
test(.regex = "e(?<foo>x)", .replace = "$${foo}}", .string = "text", .expectedString = "t${foo}}t" );
test(.regex = "e(?<foo>x)", .replace = "$${bfoo}}", .string = "text", .expectedString = "t${bfoo}}t");
test(.regex = "e(?<foo>x)", .replace = "$${foo}}", .string = "text", .expectedString = "t${foo}}t" );
test(.regex = "e(?<foo>x)", .replace = "$${foo}", .string = "text", .expectedString = "t${foo}t" );
test(.regex = "e(?<foo>x)", .replace = "$$", .string = "text", .expectedString = "t$t" );
test(.regex = "(e)(?<foo>x)", .replace = "${foo}$1$2", .string = "text", .expectedString = "txext" );
test(.regex = "(?<foo>e)(x)", .replace = "${foo}$1$2", .string = "text", .expectedString = "teext" );
test(.regex = "(e)(?<foo>x)", .replace = "${foo}$1$2$+", .string = "text", .expectedString = "txexxt" );
test(.regex = "(?<foo>e)(x)", .replace = "${foo}$1$2$+", .string = "text", .expectedString = "teexxt" );
test(.regex = "(?<foo>e)(x)", .replace = "${foo}$1$2$_", .string = "texts", .expectedString = "teextextsts");
test(.regex = "(?<foo>e)(x)", .replace = "${foo}$1$2$`", .string = "texts", .expectedString = "teextts" );
test(.regex = "(?<foo>e)(x)", .replace = "${foo}$1$2$'", .string = "texts", .expectedString = "teextsts" );
test(.regex = "(?<foo>e)(x)", .replace = "${foo}$1$2$&", .string = "texts", .expectedString = "teexexts" );
test(.regex = "<(.+?)>", .replace = "[$0:$1]", .string = "<i>am not</i>", .expectedString = "[<i>:i]am not[</i>:/i]");
test(.regex = "(?<foo>e)(?<foo>x)", .replace = "${foo}$1$2", .string = "text", .expectedString = "teext", .regexFlags = PCRE_DUPNAMES);
test(.regex = "\b(\w+)(\s)(\w+)\b", .replace = "$3$2$1", .string = "one two", .expectedString = "two one");
test(.regex = "\b(\d+)\s?USD", .replace = "$$$1", .string = "103 USD", .expectedString = "$103" );
test(.regex = "\b(?<w1>\w+)(\s)(?<w2>\w+)\b", .replace = "${w2} ${w1}", .string = "one two", .expectedString = "two one");
test(.regex = "(\$(\d(\.+\d+)?){1})", .replace = "$&", .string = "$1.30", .expectedString = "$1.30**");
test(.regex = "B+", .replace = "$`", .string = "AABBCC", .expectedString = "AAAACC");
test(.regex = "B+", .replace = "$'", .string = "AABBCC", .expectedString = "AACCCC");
test(.regex = "B+(C+)", .replace = "$+", .string = "AABBCCDD", .expectedString = "AACCDD");
test(.regex = "B+", .replace = "$_", .string = "AABBCC", .expectedString = "AAAABBCCCC");
test(.regex = "(F)(2)(3)(4)(5)(6)(7)(8)(9)(10)(L)\11", .replace = "${S}$11$1", .string = "F2345678910L71", .expectedString = "F2345678910L71"),
test(.regex = "(F)(2)(3)(4)(5)(6)(7)(8)(9)(10)(L)\11", .replace = "${S}$11$1", .string = "F2345678910LL1", .expectedString = "${S}LF1");
}

server_print("^tChecking moar #1...");
{
test(.string = "(?(w)a|o)" , .regex = "\(\?\(\w+\).\|?.\)" , .replace = "r", .expectedString = "r");
test(.string = "(?(w)|o)" , .regex = "\(\?\(\w+\).\|?.\)" , .replace = "r", .expectedString = "r");
test(.string = "(?(w)a)" , .regex = "\(\?\(\w+\).\|?.\)" , .replace = "r", .expectedString = "r");
test(.string = "(?(w)a|)" , .regex = "\(\?\(\w+\).\|?.\)" , .replace = "r", .expectedString = "r");
test(.string = "(?(w)?|a|o)" , .regex = "\(\?\(\w+\).\|?.\)" , .replace = "r", .expectedString = "r");
test(.string = "(?(w)||o)" , .regex = "\(\?\(\w+\).\|?.\)" , .replace = "r", .expectedString = "r");
test(.string = "(?(w)(a)" , .regex = "\(\?\(\w+\).\|?.\)" , .replace = "r", .expectedString = "r");
test(.string = "(?(w))\a|)" , .regex = "\(\?\(\w+\).\|?.\)" , .replace = "r", .expectedString = "r");
test(.string = "(?(2)a|o)" , .regex = "\(\?\([^^\)]+\).\|?.\)" , .replace = "r", .expectedString = "r");
test(.string = "(?(|)a|o)" , .regex = "\(\?\([^^\)]+\).\|?.\)" , .replace = "r", .expectedString = "r");
test(.string = "a\3b" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3})\\(\d+)" , .replace = "\5", .expectedString = "a\5b");
test(.string = "\3b" , .regex = "(?=(?:\A|[^^\\])(?:[\\]{2}){0,3})\\(\d+)" , .replace = "\5", .expectedString = "\5b");
test(.string = "\\\3b" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3})\\(\d+)" , .replace = "\5", .expectedString = "\\\5b");
test(.string = "\\\k<g>" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3})\\k<(\w+)>" , .replace = "\5", .expectedString = "\\\5");
test(.string = "\\\\k'g'" , .regex = "(?:(?:\A|[^^\\])(?:[\\]{2}){0,3})\\k'(\w+)'" , .replace = "\5", .expectedString = "\\\\k'g'");
test(.string = "a\\\\k'g'" , .regex = "(?:(?:\A|[^^\\])(?:[\\]{2}){0,3})\\k'(\w+)'" , .replace = "\5", .expectedString = "a\\\\k'g'");
test(.string = "\k'g'" , .regex = "(?:(?:\A|[^^\\])(?:[\\]{2}){0,3})\\k'(\w+)'" , .replace = "\5", .expectedString = "\5");
test(.string = "(?<n1-n2>)" , .regex = "\(\?<[A-Za-z]\w*-[A-Za-z]\w*>.*\)" , .replace = "r", .expectedString = "r");
test(.string = "(?'n1-n2'a)" , .regex = "\(\?'[A-Za-z]\w*-[A-Za-z]\w*'.*\)" , .replace = "r", .expectedString = "r");
test(.string = "\p{Isa}" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3}\\[pP]\{)Is(?=\w+\})", .replace = "In", .expectedString = "\p{Ina}");
test(.string = "\p{Is}" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3}\\[pP]\{)Is(?=\w+\})", .replace = "In", .expectedString = "\p{Is}");
test(.string = "\p{Isa" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3}\\[pP]\{)Is(?=\w+\})", .replace = "In", .expectedString = "\p{Isa");
test(.string = "a(?#|)" , .regex = "\(\?#[^^\)]*\)" , .replace = "", .expectedString = "a");
test(.string = "(?#|)" , .regex = "\(\?#[^^\)]*\)" , .replace = "", .expectedString = "");
test(.string = "(?#|)" , .regex = "\#[^^\n\r]*" , .replace = "", .expectedString = "(?");
test(.string = "(?inm-xs:\#)" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3}\()\?[imsx]n[-imsx]:[^^\)]+\)", .replace = "r", .expectedString = "(r");
test(.string = "(?ni:())" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3}\()\?[imsx]n[-imsx]:[^^\)]+\)", .replace = "r", .expectedString = "(r)");
test(.string = "(?x-i:)" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3}\()\?[imsx]n[-imsx]:[^^\)]+\)", .replace = "r", .expectedString = "(?x-i:)");
test(.string = "(?n:))" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3}\()\?[imsx]n[-imsx]:[^^\)]+\)", .replace = "r", .expectedString = "(?n:))");
test(.string = "(?<n1>)" , .regex = "\(\?<[A-Za-z]\w*>.*\)" , .replace = "r", .expectedString = "r");
test(.string = "(?'n1'y)" , .regex = "\(\?'[A-Za-z]\w*'.*\)" , .replace = "r", .expectedString = "r");
test(.string = "(?<45>y)" , .regex = "\(\?<\d+>.*\)" , .replace = "r", .expectedString = "r");
test(.string = "(?'7'o)" , .regex = "\(\?'\d+'.*\)" , .replace = "r", .expectedString = "r");
test(.string = "\\\(" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3})\\\(" , .replace = "r", .expectedString = "\\r");
test(.string = "a\\\(" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3})\\\(" , .replace = "r", .expectedString = "a\\r");
test(.string = "\\(" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3})\\\(" , .replace = "r", .expectedString = "\r");
test(.string = "a\\(" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3})\\\(" , .replace = "r", .expectedString = "a\r");
test(.string = "\(" , .regex = "(?:(?:\A|[^^\\])(?:[\\]{2}){0,3})\\\(" , .replace = "r", .expectedString = "r");
test(.string = "a\(" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3})\\\(" , .replace = "r", .expectedString = "ar");
test(.string = "?:" , .regex = "(?:^^\?[:imnsx=!>-]|^^\?<[!=])" , .replace = "r", .expectedString = "r");
test(.string = "?<!" , .regex = "(?:^^\?[:imnsx=!>-]|^^\?<[!=])" , .replace = "r", .expectedString = "r");
test(.string = "?-" , .regex = "(?:^^\?[:imnsx=!>-]|^^\?<[!=])" , .replace = "r", .expectedString = "r");
test(.string = "\(?<n>" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3}\()\?<[A-Za-z]\w*>", .replace = "r", .expectedString = "\(r");
test(.string = "a\(?'n'" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3}\()\?'[A-Za-z]\w*'", .replace = "r", .expectedString = "a\(r");
test(.string = "\\(?<2>" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3}\()\?<\d+>" , .replace = "r", .expectedString = "\\(r");
test(.string = "(?'2'" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3}\()\?'\d+'" , .replace = "r", .expectedString = "(r");
test(.string = "\[\b]" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2})(?:\[|\[[^^\[\]][^^\[\]\\])(?:[\\]{2}))\\b(?=[^^\[\]]\])", .replace = "\\u8", .expectedString = "\[\u8]");
test(.string = "\[a\bb]" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2})(?:\[|\[[^^\[\]][^^\[\]\\])(?:[\\]{2}))\\b(?=[^^\[\]]\])", .replace = "\\u8", .expectedString = "\[a\u8b]");
test(.string = "\[\b]" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2})(?:\[|\[[^^\[\]][^^\[\]\\])(?:[\\]{2}))\\b(?=[^^\[\]]\])", .replace = "\\u8", .expectedString = "\[\u8]");
test(.string = "\[\b]" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2})(?:\[|\[[^^\[\]][^^\[\]\\])(?:[\\]{2}))\\b(?=[^^\[\]]\])", .replace = "\\u8", .expectedString = "\[\u8]");
test(.string = "\[\\b]" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2})(?:\[|\[[^^\[\]][^^\[\]\\])(?:[\\]{2}))\\b(?=[^^\[\]]\])", .replace = "\\u8", .expectedString = "\[\\u8]");
test(.string = "[[]" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2})(?:\[|\[[^^\[\]][^^\[\]\\])(?:[\\]{2}))\[(?=[^^\[\]]\])" , .replace = "\\[" , .expectedString = "[\[]");
test(.string = "\[[]" , .regex = "(?:(?:\A|[^^\\])(?:[\\]{2})(?:\[|\[[^^\[\]][^^\[\]\\])(?:[\\]{2}))\[(?=[^^\[\]]\])" , .replace = "\[" , .expectedString = "\[[]");
test(.string = "\[\[]" , .regex = "(?:(?:\A|[^^\\])(?:[\\]{2})(?:\[|\[[^^\[\]][^^\[\]\\])(?:[\\]{2}))\[(?=[^^\[\]]\])" , .replace = "\[" , .expectedString = "\[\[]");
test(.string = "\[\[]" , .regex = "(?:(?:\A|[^^\\])(?:[\\]{2})(?:\[|\[[^^\[\]][^^\[\]\\])(?:[\\]{2}))\[(?=[^^\[\]]\])" , .replace = "\[" , .expectedString = "\[\[]");
test(.string = "\{" , .regex = "(?=(?:\A|[^^\\])(?:[\\]{2}))\{(?!\d\d(,(\d\d*)?)?\})", .replace = "\{", .expectedString = "\\{");
test(.string = "\{" , .regex = "(?=(?:\A|[^^\\])(?:[\\]{2}))\{(?!\d\d(,(\d\d*)?)?\})", .replace = "\{", .expectedString = "\\{");
test(.string = "\{1,2}" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}))\{(?!\d\d(,(\d\d*)?)?\})", .replace = "\{", .expectedString = "\{1,2}");
test(.string = "\{1}" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}))\{(?!\d\d(,(\d\d*)?)?\})", .replace = "\{", .expectedString = "\{1}");
test(.string = "\{1,}" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}))\{(?!\d\d(,(\d\d*)?)?\})", .replace = "\{", .expectedString = "\{1,}");
test(.string = "\{1" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}))\{(?!\d\d(,(\d\d*)?)?\})", .replace = "\\{", .expectedString = "\{1");
test(.string = "\\(?!{1}" , .regex = "(\A|((\A|[^^\\])([\\]{2})*\((\?([:>=!]|<([=!]|(\w+>))))?))\{\d+(,(\d+)?)?\}", .replace = "\5", .expectedString = "?!");
test(.string = "{1}" , .regex = "(\A|((\A|[^^\\])([\\]{2})*\((\?([:>=!]|<([=!]|(\w+>))))?))\{\d+(,(\d+)?)?\}", .replace = "r", .expectedString = "r");
test(.string = "({1}" , .regex = "(\A|((\A|[^^\\])([\\]{2})*\((\?([:>=!]|<([=!]|(\w+>))))?))\{\d+(,(\d+)?)?\}", .replace = "r", .expectedString = "r");
test(.string = "(?{1}" , .regex = "(\A|((\A|[^^\\])([\\]{2})*\((\?([:>=!]|<([=!]|(\w+>))))?))\{\d+(,(\d+)?)?\}", .replace = "r", .expectedString = "(?{1}");
test(.string = "(?:{1}" , .regex = "(\A|((\A|[^^\\])([\\]{2})*\((\?([:>=!]|<([=!]|(\w+>))))?))\{\d+(,(\d+)?)?\}", .replace = "r", .expectedString = "r");
test(.string = "\({1}" , .regex = "(\A|((\A|[^^\\])([\\]{2})*\((\?([:>=!]|<([=!]|(\w+>))))?))\{\d+(,(\d+)?)?\}", .replace = "r", .expectedString = "\({1}");
test(.string = "\p{Isa}" , .regex = "(?!\\[pP]\{)Is(?=\w+\})" , .replace = "In", .expectedString = "\p{Ina}");
test(.string = "\p{Is}" , .regex = "(?!\\[pP]\{)Is(?=\w+\})" , .replace = "In", .expectedString = "\p{Is}");
test(.string = "\p{Isa" , .regex = "(?!\\[pP]\{)Is(?=\w+\})" , .replace = "In", .expectedString = "\p{Isa");
test(.string = "\}" , .regex = "(?!(\\A|[^^\\])(\\{2})\\{\\d\\d(,(\\d\\d*)?)?)\\}", .replace = "\\}", .expectedString = "\}");
test(.string = "{\}" , .regex = "(?!(\A|[^^\^^])(\^^{2})\{\d\d(,(\d\d*)?)?)\}", .replace = "\\}", .expectedString = "{\\}");
test(.string = "{1,2}" , .regex = "(?!(\A|[^^\\])(\\{2})\{\d\d(,(\d\d*)?)?)\}" , .replace = "\\}", .expectedString = "{1,2\}");
test(.string = "\{1}" , .regex = "(?!(\A|[^^\\])(\\{2})\{\d\d(,(\d\d*)?)?)\}" , .replace = "\\}", .expectedString = "\{1\}");
test(.string = "\{1\}" , .regex = "(?!(\A|[^^\\])(\\{2})\{\d\d(,(\d\d*)?)?)\}" , .replace = "\\}", .expectedString = "\{1\\}");
test(.string = "\{1}" , .regex = "(?!(\A|[^^\\])(\\{2})\{\d\d(,(\d\d*)?)?)\}" , .replace = "\\}", .expectedString = "\{1\}");
test(.string = "{1,}" , .regex = "(?!(\A|[^^\\])(\\{2})\{\d\d(,(\d\d*)?)?)\}" , .replace = "\\}", .expectedString = "{1,\}");
test(.string = "a(?<!b*c)" , .regex = "\(\?\<[=!][^^\)](?:[\\+]|\{\d+,\}).*\)" , .replace = "r", .expectedString = "ar");
test(.string = "a(?<!b+c)" , .regex = "\(\?\<[=!][^^\)](?:[\\+]|\{\d+,\}).*\)" , .replace = "r", .expectedString = "ar");
test(.string = "(?<!b{1}c))" , .regex = "\(\?\<[=!][^^\)](?:[\\+]|\{\d+,\}).*\)" , .replace = "r", .expectedString = "(?<!b{1}c))");
test(.string = "(?<!b{1,}c)" , .regex = "\(\?\<[=!][^^\)](?:[\\+]|\{\d+,\}).*\)" , .replace = "r", .expectedString = "r");
test(.string = "(?<!b{1,4}c)" , .regex = "\(\?\<[=!][^^\)](?:[\\+]|\{\d+,\}).*\)" , .replace = "r", .expectedString = "(?<!b{1,4}c)");
test(.string = "a\3b" , .regex = "\\(\d+)" , .replace = "\5", .expectedString = "a\5b");
test(.string = "\3b" , .regex = "\\(\d+)" , .replace = "\5", .expectedString = "\5b");
test(.string = "\\3b" , .regex = "(?!\\\\)\\(\d)" , .replace = "\5", . expectedString = "\\5b");
test(.string = "a\\3b" , .regex = "(?:(\\){0,3})\\(\d)" , .replace = "\5", . expectedString = "a\5b");
test(.string = "\\k<g>" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3})\\k<(\w)>" , .replace = "\5", .expectedString = "\\5");
test(.string = "a\\k<g>" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3})\\k<(\w)>" , .replace = "\5", .expectedString = "a\\5");
test(.string = "\\k'g'" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3})\\k'(\w)'" , .replace = "\5", .expectedString = "\\5");
test(.string = "a\\k'g'" , .regex = "(?!(?:\A|[^^\\])(?:[\\]{2}){0,3})\\k'(\w)'" , .replace = "\5", .expectedString = "a\\5");
test(.string = "\k'g'" , .regex = "(?:(?:\A|[^^\\])(?:[\\]{2}){0,3})\\k'(\w)'" , .replace = "\5", .expectedString = "\5");
}

server_print("^tChecking moar #2...");
{
test(.regex = "^^((?>[a-zA-Z\d!#$%&'+\-\/=?^^`{|}~]+\x20|^"((?=[\x01-\x7f])[^^^"\\]|\\[\x01-\x7f])^"\x20)(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'+\-\/=?^^`{|}~]+)+|^"((?=[\x01-\x7f])[^^^"\\]|\\[\x01-\x7f])^")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-][a-zA-Z\d]:((?=[\x01-\x7f])[^^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$" ,
.replace = "$1$4@$7net>",
.string = "Name Surname <[email protected]>",
.expectedString = "Name Surname <[email protected]>"
);

test(.regex = "([A-Z])\w+",
.replace = "snip",
.string = "Welcome to RegExr v2.0 by gskinner.com!\
\
Edit the Expression & Text to see matches. Roll over matches or the expression for details. Undo mistakes with ctrl-z. Save & Share expressions with friends or the Community. A full Reference & Help is available in the Library, or watch the video Tutorial.\
\
Sample text for testing:\
abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ\
:0123456789 +-.,!@#$%^^&*();\/|<>^"'\
12345 -98.7 3.141 .6180 9,000 +42\
555.123.4567 +1-(800)-555-2468\
[email protected] [email protected]\
www.demo.com http://foo.co.uk/\
http://regexr.com/foo.html?q=bar",

.expectedString = "snip to snip v2.0 by gskinner.com!\
\
snip the snip & snip to see matches. snip over matches or the expression for details. snip mistakes with ctrl-z. snip & snip expressions with friends or the snip. A full snip & snip is available in the snip, or watch the video snip.\
\
snip text for testing:\
abcdefghijklmnopqrstuvwxyz snip\
:0123456789 +-.,!@#$%^^&*();\/|<>^"'\
12345 -98.7 3.141 .6180 9,000 +42\
555.123.4567 +1-(800)-555-2468\
[email protected] [email protected]\
www.de",
.regexFlags = PCRE_EXTENDED
);

test(.regex = "/\(?>[^^/]+|\[^^/]|/[^^]|/\(?>[^^/]+|\[^^/]|/[^^])\/)\/",
.replace = "",
.string = "/* comment */\
no comment\
/* comment\
spanning\
multiple\
lines */\
/* comment /* nesting / of / two */ levels supported */\
/* comment /* nesting / of / /* more than */ two levels */ not supported */",
.expectedString = "no comment\
/* comment of not supported */"
);

test(.regex = "\b(?<protocol>https?|ftp)://(?<domain>[A-Z0-9.-]+)(?<file>/[A-Z0-9+&@#/%=~|!:,.;-])?(?<parameters>\?[A-Z0-9+&@#/%=~|!:,.;])?",
.replace = "${protocol}s://site.com${file}^n",
.string = "http://www.alliedmods.net http://www.alliedmods.net/ http://www.alliedmods.net/test.php http://www.alliedmods.net/index.php?secret=x Something interesting at http://www.alliedmods.net.",
.expectedString = "https://site.com^nhttps://site.com/^nhttps://site.com/test.php^nhttps://site.com/index.php^nhttps://site.com^n",
.regexFlags = PCRE_CASELESS | PCRE_EXTENDED,
.formatFlags = REGEX_FORMAT_NOCOPY
);

test(.regex = "\b(https?|ftp)://([A-Z0-9.-]+)(/[A-Z0-9+&@#/%=~|!:,.;-])?(\?[A-Z0-9+&@#/%=~|!:,.;])?",
.replace = "$1s://site.com$3^n",
.string = "http://www.alliedmods.net http://www.alliedmods.net/ http://www.alliedmods.net/test.php http://www.alliedmods.net/index.php?secret=x Something interesting at http://www.alliedmods.net.",
.expectedString = "https://site.com^nhttps://site.com/^nhttps://site.com/test.php^nhttps://site.com/index.php^nhttps://site.com^n",
.regexFlags = PCRE_CASELESS | PCRE_EXTENDED,
.formatFlags = REGEX_FORMAT_NOCOPY
);

test(.regex = "\b(https?|ftp)://([A-Z0-9.-]+)(/[A-Z0-9+&@#/%=~|!:,.;-])?(\?[A-Z0-9+&@#/%=~|!:,.;])?",
.replace = "$1s://site.com$3^n",
.string = "http://www.alliedmods.net http://www.alliedmods.net/ http://www.alliedmods.net/test.php http://www.alliedmods.net/index.php?secret=x Something interesting at http://www.alliedmods.net.",
.expectedString = "https://site.com^n",
.regexFlags = PCRE_CASELESS | PCRE_EXTENDED,
.formatFlags = REGEX_FORMAT_NOCOPY | REGEX_FORMAT_FIRSTONLY
);

test(.regex = "^^(.++)\r?\n(?=(?:^^(?!\1$).+\r?\n)+\1$)",
.replace = "",
.string = "one^n\
two^n\
three^n\
four^n\
two^n\
three^n\
four^n\
three^n\
four^n\
four",
.expectedString = "one^n\
two^n\
three^n\
four",
.regexFlags = PCRE_EXTENDED | PCRE_MULTILINE
);
}

end();
}
[/CODE]

Ну как читабельнее стало ? использовать деф названия входящих аргументов с точкой перед их именем - зачем ? чтоб на 1 миллиард циклов выйграть 0.001 процент производительности ? да просто использование зелёных символов x04 колорчата уже фпс режет в 3 раза... PAWN SMALL - что говорит от название, он и так быстрый прекомпилируемый язык , язык сделан был для быстрого кодинга ивентов в играх. Зачем в него тащить всё из всего ? вам мало с++ ? Зачем из PAWN франкенштейна делать ? давайте писать под метамод на чистом c(c++) тогда . По метамоду как раз мало статей и всего прочего. Я вот пыталась скомпилировать под метамод плагин так ошибка вылезла, хотя все библиотеки на месте были и SDK, помощи не нашла в интернете на английском и бросила это занятие. Всё хорошо в меру и когда уместно. А про обёртки функций в 3 слоя, это я почитала что вы в стоках меряете линейкой у кого макрос круче и сделала вывод, что от таких обёрток часто только вред, ибо простая функция, занимает 3 сточки, а они делают с обёртками в 1 сточку, но читать не возможно код потом. Видимо скучно людям живётся. Спасибо.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу