0
 string st = Convert.ToString(Regex.Match(str, "id=\"user_online\">\\d*").Groups[0]);

Как получить отсюда значение \d*?

deced
  • 95

2 Answers2

2
const int wholePhraseGroupIndex = 0;
const int numberGroupIndex = 1;

// Комилируем регулярное выражение для ускорения поиска
Regex regex = new Regex("id=\"user_online\">(\\d+)", RegexOptions.Compiled);

// Сравниваем строку с паттерном
Match match = regex.Match(str);

// Проверяем, что строка совпала
if (!match.Success)
    throw new FormatException("Строка имеет неверный формат: " + str);

// Извлекаем содержимое скобок
string numberStr = match.Groups[numberGroupIndex].Value;

// Парсим значение
int number = int.Parse(numberStr, CultureInfo.InvariantCulture);
2

Надежный способ получения части совпадения - именованные группы:

var str = "id=\"user_online\">33";
var match = Regex.Match(str, "id=\"user_online\">(?'usersCount'\\d*)");
if (match.Success)
{
    var usersCount = match.Groups["usersCount"].Value; // "33"
}

Альтернативный вариант - использование механизма positive lookbehind. В вашем случае - поиска таких \d*, перед которыми стоит тэг:

var match = Regex.Match(str, "(?<=id=\"user_online\">)\\d*");
if (match.Success)
{
    var usersCount = match.Value; // 33
}

Ну или можно обернуть \d* в скобки и достать Groups[1], но этот подход может поломаться при переписывании регулярки в будущем.

Не забывайте, что парсить HTML регулярными выражениями - плохая идея. Есть гораздо более простые способы извлечь значения из тэгов.

  • сколько лет живу на свете, а не знал, что в регулярках есть именованные группы. :D – Lunar Whisper Aug 16 '17 at 10:45