Регулярные выражения задачка и вопросик.

Banana

Участник
Сообщения
892
Реакции
113
char msg[196] = "Здравствуйте, помогите мне 83264 извлечь цифры в отдельную строку, при чем таких 99223 цифр может быть несколько, а 80033 по этому это должен быть массив char'ов. К тожу-же у4итываютс9 только цифры с00стоящие из 5+ символов вряд.";

Здравствуйте, с помощью регулярных выражений нужно реализовать такую задачу... (а конкретней я незнаю как получить номер ячейки с первым совпадением и продолжить искать следующее совпадение пока строка не кончится.)
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
char msg[196] = "Здравствуйте, помогите мне 83264 извлечь цифры в отдельную строку, при чем таких 99223 цифр может быть несколько, а 80033 по этому это должен быть массив char'ов. К тожу-же у4итываютс9 только цифры с00стоящие из 5+ символов вряд.";

Здравствуйте, с помощью регулярных выражений нужно реализовать такую задачу... (а конкретней я незнаю как получить номер ячейки с первым совпадением и продолжить искать следующее совпадение пока строка не кончится.)
Regex.MatchAll · regex · SourceMod Scripting API Reference + Regex.GetSubString · regex · SourceMod Scripting API Reference
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #3
1648538464544.png

/\D?(\d{5,})\D?/g
 

Banana

Участник
Сообщения
892
Реакции
113
Спасибо за направления решения, сделайте так чтоб я мог оставлять реакции.
Сообщения автоматически склеены:

Дайте ссылку на этот сайт, удобный интерфейс)
 

Banana

Участник
Сообщения
892
Реакции
113
PHP:
char msg[196] = "Здра83264gg циф, 80033 по эываютс9 фры с00стоящие из 5+ си.";
    Regex ip_Regex = new Regex("\\D?(\\d{5,})\\D?");
    int MatchCount = ip_Regex.MatchAll(msg);
    PrintToServer("MatchCount = %d", MatchCount);
    for(int i = 0; i < MatchCount; i++)
    {
        PrintToServer("ip_Regex.MatchOffset(i) = %d", ip_Regex.MatchOffset(i));
        char text[32]; ip_Regex.GetSubString(i, text, 32);
        PrintToServer("text = %s", text);
    }

MatchCount = 2
ip_Regex.MatchOffset(i) = 14
text = °83264g
ip_Regex.MatchOffset(i) = 30
text = 83264

Объясните что это за странный вывод получился? Нужно в text в цикле получить 83264 и 80033
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #7
PHP:
char msg[196] = "Здра83264gg циф, 80033 по эываютс9 фры с00стоящие из 5+ си.";
    Regex ip_Regex = new Regex("\\D?(\\d{5,})\\D?");
    int MatchCount = ip_Regex.MatchAll(msg);
    PrintToServer("MatchCount = %d", MatchCount);
    for(int i = 0; i < MatchCount; i++)
    {
        PrintToServer("ip_Regex.MatchOffset(i) = %d", ip_Regex.MatchOffset(i));
        char text[32]; ip_Regex.GetSubString(i, text, 32);
        PrintToServer("text = %s", text);
    }

MatchCount = 2
ip_Regex.MatchOffset(i) = 14
text = °83264g
ip_Regex.MatchOffset(i) = 30
text = 83264

Объясните что это за странный вывод получился? Нужно в text в цикле получить 83264 и 80033

крч припоминаю что это баг какой-то GetSubString.
Попробуй искать первое совпадение и потом искать следующее уже после него
 

romeo7

Участник
Сообщения
189
Реакции
93
PHP:
char msg[196] = "Здра83264gg циф, 80033 по эываютс9 фры с00стоящие из 5+ си.";
    Regex ip_Regex = new Regex("\\D?(\\d{5,})\\D?");
    int MatchCount = ip_Regex.MatchAll(msg);
    PrintToServer("MatchCount = %d", MatchCount);
    for(int i = 0; i < MatchCount; i++)
    {
        PrintToServer("ip_Regex.MatchOffset(i) = %d", ip_Regex.MatchOffset(i));
        char text[32]; ip_Regex.GetSubString(i, text, 32);
        PrintToServer("text = %s", text);
    }

MatchCount = 2
ip_Regex.MatchOffset(i) = 14
text = °83264g
ip_Regex.MatchOffset(i) = 30
text = 83264

Объясните что это за странный вывод получился? Нужно в text в цикле получить 83264 и 80033

Попробуй так::
    char text[32], msg[196] = "Здра83264gg циф, 80033 по эываютс9 фры с00стоящие из 5+ си.";
    int iOffest;
    
    Regex ip_Regex = new Regex("\\d{5,}");
    ip_Regex.Match(msg);
    
    do
    {
        ip_Regex.GetSubString(0, text, sizeof(text));
        PrintToServer("text = %s", text);
        
        iOffest += ip_Regex.MatchOffset(0);
    }
    while (ip_Regex.Match(msg[iOffest]) == 1)
 

Banana

Участник
Сообщения
892
Реакции
113
Попробуй так::
    char text[32], msg[196] = "Здра83264gg циф, 80033 по эываютс9 фры с00стоящие из 5+ си.";
    int iOffest;
   
    Regex ip_Regex = new Regex("\\d{5,}");
    ip_Regex.Match(msg);
   
    do
    {
        ip_Regex.GetSubString(0, text, sizeof(text));
        PrintToServer("text = %s", text);
       
        iOffest += ip_Regex.MatchOffset(0);
    }
    while (ip_Regex.Match(msg[iOffest]) == 1)
Сработало <3
 

romeo7

Участник
Сообщения
189
Реакции
93
Другой простой способ для вас::
{
    char msg[196] = "Здра83264gg циф, 80033 по эываютс9 фры с00стоящие из 5+ си.";
    Regex ip_Regex = new Regex("\\d{5,}");
    int MatchCount = ip_Regex.MatchAll(msg);
    PrintToServer("MatchCount = %d", MatchCount);
    for(int i = 0; i < MatchCount; i++)
    {
        PrintToServer("ip_Regex.MatchOffset(i) = %d", ip_Regex.MatchOffset(i));
        char text[32]; GetSubStringEx(ip_Regex, msg, i, text, 32);
        PrintToServer("text = %s", text);
    }
}

/**
 * Returns a matched substring from a regex handle.
 * Substring ids start at 0 and end at captures-1, where captures is the
 * number returned by Regex.Match or Regex.CaptureCount.
 *
 * @param regex         The regex handle to extract data from.
 * @param str           The string to check.
 * @param str_id        The index of the expression to get - starts at 0, and ends at captures - 1.
 * @param buffer        The buffer to set to the matching substring.
 * @param maxlen        The maximum string length of the buffer.
 * @param match         Match to get the captures for - starts at 0, and ends at MatchCount() -1
 * @return              True if a substring was found, False on fail/error
 *
 * @note str_id = 0 is the full captured string, anything else is the capture group index.
 **/
stock bool GetSubStringEx(Regex regex, const char[] str, int str_id, char[] buffer, int maxlen, int match = 0)
{
    if (str_id > 0) regex.MatchAll(str[regex.MatchOffset(str_id-1)]);
    bool bValue = regex.GetSubString(0, buffer, maxlen, match);
    regex.MatchAll(str);
    return bValue;
}
 
Сверху Снизу