Регулярные выражения (Модуль Regex)

Сообщения
49
Реакции
32
Доброго здравия всем читающим. Уже несколько часов ломаю голову, не понимая как работает Regex.

Суть в следующем:
Есть срока, содержащая различные "левые" символы. Необходимо получить чистую строчку.

Задача усложняется тем, что строка может содержать абсолютно рандомные символы, вплоть до подобных - ©

Что я пытаюсь делать:
Объявил паттерн в начале плагина, предварительно протестировав на различных сервисах
new g_szRegexPattern[] = "[a-zA-Zа-яА-Я.-]+";
1686157324802.png 1686157344118.png

Далее я пытаюсь найти совпадения по этому шаблону и получить результат из хендла (цикл сделал с заделом на несколько результатов, не обращайте внимание)
Код:
new test_str[] = "$$$Красивая.строка$$$$";

new iRetNum, test_result_str[64];

new Regex:regex_handle = regex_match(test_str, g_szRegexPattern, iRetNum);
if(regex_handle >= REGEX_OK){
for(new i=0; i < iRetNum; i++){
    regex_substr(regex_handle, i, test_result_str, charsmax(test_result_str));
}
server_print("test_result_str: %s, iRetNum: %d", test_result_str, iRetNum);
При этом в консоли я вижу вот это. В игре такой же результат
1686158288413.png

При этом, если использовать английский язык, то все прекрасно работает
1686158473797.png

Подскажите, что я делаю не так? Это ошибка в паттерне или Regex не может работать с кириллицей? Может, есть другой способ очистить строку от всякой ерунды с сохранением знаков препинания?
 
Сообщения
246
Реакции
268
Помог
2 раз(а)
Сообщения
49
Реакции
32
Arni, не совсем понял, что это делает.
^ - начало строки
.*? - ленивый квантификатор для любых символов (?)
$ - конец строки

Как это поможет отфильтровать сторонние символы из строки? Подсказку не понял :scratch_one-s_head:
 
Сообщения
246
Реакции
268
Помог
2 раз(а)
UrShade, не так прочел твоё сообщение
 

Albertio

скриптизёр
Сообщения
336
Реакции
393
Предупреждения
5
Помог
7 раз(а)
Код:
#include <amxmodx>
#include <regex>

new const REGEX_PATTERN[] = "[a-zA-ZаАбБвВгГдДеЕёЁжЖзЗиИйЙкКлЛмМнНоОпПрРсСтТуУфФхХцЦчЧшШщЩъЪыЫьЬэЭюЮяЯ.-]+";

public plugin_init() {
    register_plugin("Test", "0.0.1", "Albertio");

    new szStrTest[] = "$$$Красивая.строка$$$";

    new iRetNum, szStrRes[64];

    new Regex:regex_handle = regex_match(szStrTest, REGEX_PATTERN, iRetNum);

    if(regex_handle >= REGEX_OK)
        for(new i; i < iRetNum; i++)
            regex_substr(regex_handle, i, szStrRes, charsmax(szStrRes));

    server_print("szStrRes: %s | iRetNum: %d", szStrRes, iRetNum);
}
 
Сообщения
49
Реакции
32
Albertio, спасибо. Это сработало лучше. Но если в начало строки добавить какой-нибудь смайлик (альт + 1, альт + 3, например) или, допустим, знак копирайта © , то все снова ломается.

new szStrTest[] = "☺ $$$Красивая.строка$$$";

1686227998822.png
 
Сообщения
934
Реакции
186
Помог
4 раз(а)
UrShade, добавь их тоже в проверку
 
Сообщения
1,668
Реакции
1,495
Помог
24 раз(а)
аАбБвВгГдДеЕёЁжЖзЗиИйЙкКлЛмМнНоОпПрРсСтТуУфФхХцЦчЧшШщЩъЪыЫьЬэЭюЮяЯ
=>
А-Яа-яёЁ
 
Сообщения
49
Реакции
32
BiZaJe, их ведь огромная куча и маленькая тележка
 
Сообщения
657
Реакции
229
Помог
11 раз(а)
попробуй

Код:
new g_szRegexPattern[] = "[a-zA-ZА-Яа-я.-]+";
 
Последнее редактирование:
Сообщения
49
Реакции
32
Алексеич, спасибо за совет, но rehlds-m нет возможности установить
Код:
#include <amxmodx>
#include <regex>

new const REGEX_PATTERN[] = "[А-Яа-я\.-]+/u";

public plugin_init() {
    register_plugin("Test", "0.0.1", "Albertio");

    new szStrTest[] = "© $$$Красивая.строка$$$";

    new iRetNum, szStrRes[64];

    new Regex:regex_handle = regex_match(szStrTest, REGEX_PATTERN, iRetNum);

    if(regex_handle >= REGEX_OK)
        for(new i; i < iRetNum; i++)
            regex_substr(regex_handle, i, szStrRes, charsmax(szStrRes));

    server_print("szStrRes: %s | iRetNum: %d", szStrRes, iRetNum);
}
1686245695776.png

Limbooc, не сработало :(
 
Сообщения
246
Реакции
268
Помог
2 раз(а)
UrShade, regex кривой в amxx, проверяй каждый символ самостоятельно)
 

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

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