Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Общалка aka Флуд _ Вопрос по регулярным выражениям (не относится к lua)

Автор: Accelerator 22.12.2012, 9:10

Возник вопрос с регулярными выражениями. Имеется скрипт для Sourcemod'а

Код
#include <sourcemod>
#include <regex>

new Handle:g_Regex = INVALID_HANDLE;

public OnPluginStart()
{
    g_Regex = CompileRegex("([a-zA-Zа-яА-Я ]+)");
}

public bool:OnClientConnect(client, String:rejectmsg[], maxlen)
{
   return CheckName(client);
}

public bool:CheckName(client)
{
   if (IsFakeClient(client))
      return true;
  
   new String:clientname[128];
   GetClientName(client, clientname, sizeof(clientname));

   new String:buf[64];
   new index = MatchRegex(g_Regex, clientname);
   for (new i = 0; i < index; i++)
   {
      GetRegexSubString(g_Regex, i, buf, sizeof(buf));
   }

   if (strlen(buf) < 1)
   {
      KickClient(client, "Bad name!");
      return false;
   }
   SetClientInfo(client, "name", buf);
  
   return true;
}

Данный скрипт должен отбирать из имени игрока только символы, которые удовлетворяют регулярному выражению. Но работает не так, как нужно. Вот пример:

Ник: Tester 174 Test
На выходе: Tester
А должно быть: Tester Test

Помогите правильно подобрать регулярное выражение.

То, что находит скрипт:
matches: 0: (Tester )
1: (Tester )

Регулярное выражение пытался подбирать на этом сайте: http://mydc.ru/r/?http://www.regextester.com/ но так ничего и не смог.

Автор: Setuper 22.12.2012, 18:37

Логично, что регулярное выражение [a-zA-Zа-яА-Я ]+ захватить всё до цифр.
В данном случае нельзя регулярным выражением захватить все, кроме подстроки.
Нужно либо захватывать по частям, например, так: ([a-zA-Zа-яА-Я ]+)\d*([a-zA-Zа-яА-Я ]+)
и после этого сконкатенировать два полученных отрезка, либо же нужно использовать какую-то функцию, которая делает замену по регулярному выражению. Что-то типа:

Код
ReplaceAll(str, "[\d]*", "")
если такая есть в приведенным тобою языке.