Регулярные выражения SourceMod

GeParD

SourcePawn
Сообщения
8
Реакции
9
Все доброй ночи )

У меня возник любопытный вопрос по поводу некоторой части работы регулярных выражений на 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*
 
Последнее редактирование:
Сверху Снизу