GeParD
SourcePawn
- Сообщения
- 8
- Реакции
- 9
Все доброй ночи )
У меня возник любопытный вопрос по поводу некоторой части работы регулярных выражений на sourcemod.
Система:
Counter Strike Server v34.4044
Metamod:Source version 1.8.7
SourceMod Version: 1.3.2
Теперь суть вопроса...
Есть 2 флага
MULTILINE и SINGLE
Single - удобно для поиска совпадений выражения в текста.
Multiline - удобно для обработки текста. (поиск совпадений и выполнения тех или иных действий с найденным текстом).
из сути выше сложенного кода
результат должен быть
хотя на самом деле выходит почему то только
Теперь паралель, которую я никак не могу объяснить для себя.
Результат:
Возникает вопрос... что я делаю не так ?)....
P.s Так же пробовал ставить более рании версии метамода
более рании и позднии версии сурсмода.
сути дело не меняет
Добавлено через 1 час 12 минут
Я нашел альтернативное решение данного вопроса, но если честно оно меня не устраивает.
Результат:
У меня возник любопытный вопрос по поводу некоторой части работы регулярных выражений на sourcemod.
Система:
Counter Strike Server v34.4044
Metamod:Source version 1.8.7
SourceMod Version: 1.3.2
C-подобный:
public OnPluginStart()
{
new String:RgxPattern[] = "\\d+";
new String:RgxText[] = "1 2 3 4 5";
new Handle:Rgx = IsPattern(RgxPattern, PCRE_MULTILINE | PCRE_CASELESS);
new Match = MatchRegex(Rgx, RgxText);
PrintToServer("Rgx.Match:[%i]", Match);
if(Match > 0)
{
decl String:CurrentText[64];
for(new i=0;i<Match;i++)
{
GetRegexSubString(Rgx, i, CurrentText, sizeof(CurrentText));
PrintToServer("Rgx.Substring:'%s'", CurrentText);
}
}
CloseHandle(Rgx);
}
Handle:IsPattern(const String:Pattern[], Flag=0)
{
new Handle:Regular;
decl String:RgxError[64];
Regular = CompileRegex(Pattern, Flag, RgxError, sizeof(RgxError));
if (Regular != INVALID_HANDLE)
return Regular;
LogError("nProtect.ChatFilter: Error Pattern:%s", RgxError);
return INVALID_HANDLE;
}
Теперь суть вопроса...
Есть 2 флага
MULTILINE и SINGLE
Single - удобно для поиска совпадений выражения в текста.
Multiline - удобно для обработки текста. (поиск совпадений и выполнения тех или иных действий с найденным текстом).
из сути выше сложенного кода
результат должен быть
Rgx.Match:[5]
Rgx.Substring:'1'
Rgx.Substring:'2'
Rgx.Substring:'3'
Rgx.Substring:'4'
Rgx.Substring:'5'
хотя на самом деле выходит почему то только
Rgx.Match:[1]
Rgx.Substring:'1'
Теперь паралель, которую я никак не могу объяснить для себя.
new String:RgxPattern[] = "gepard(1|2)";
new String:RgxText[] = "gepard1 gepard2";
Результат:
илиRgx.Match:[2]
Rgx.Substring:'gepard1'
Rgx.Substring:'1'
new String:RgxPattern[] = "(1|2)";
new String:RgxText[] = "gepard1 gepard2";
Rgx.Match:[2]
Rgx.Substring:'1'
Rgx.Substring:'1'
Возникает вопрос... что я делаю не так ?)....
P.s Так же пробовал ставить более рании версии метамода
более рании и позднии версии сурсмода.
сути дело не меняет
Добавлено через 1 час 12 минут
Я нашел альтернативное решение данного вопроса, но если честно оно меня не устраивает.
public OnPluginStart()
{
decl String:MatchText[128];
new String:RgxPattern[] = "\\d+";
new String:RgxText[] = "a1 b2 c2 d3 e4 f5";
new String:ReplaceText[] = "*";
new Handle:Rgx = IsPattern(RgxPattern, PCRE_CASELESS);
new Match;
PrintToServer("Rgx.In.Text:%s", RgxText);
if(Rgx != INVALID_HANDLE)
{
while((Match = MatchRegex(Rgx, RgxText)) > 0)
{
GetRegexSubString(Rgx, 0, MatchText, sizeof(MatchText));
ReplaceString(RgxText, sizeof(RgxText), MatchText, ReplaceText);
PrintToServer("Rgx.Match:[%i]", Match);
PrintToServer("Rgx.Substring:[%s]", MatchText);
}
CloseHandle(Rgx);
}
PrintToServer("Rgx.Out.Text:%s", RgxText);
}
Результат:
Rgx.In.Text:a1 b2 c2 d3 e4 f5
Rgx.Match:[1]
Rgx.Substring:[1]
Rgx.Match:[1]
Rgx.Substring:[2]
Rgx.Match:[1]
Rgx.Substring:[3]
Rgx.Match:[1]
Rgx.Substring:[4]
Rgx.Match:[1]
Rgx.Substring:[5]
Rgx.Out.Text:a* b* c* d* e* f*
Последнее редактирование: