gtk, regexp: как получить значение группы - PullRequest
1 голос
/ 04 августа 2011

У меня есть следующий код:

gchar **split = g_strsplit(str, "\n", 0);
gchar **pointer = NULL;
GRegex *line_regex = NULL;
GMatchInfo *info = NULL;
line_regex = g_regex_new("^.*:(\\d+):.*$", 0, 0, NULL);

gtk_list_store_clear(store);
gtk_list_store_clear(store);
for (pointer = split; *pointer; pointer++)
    if (strlen(*pointer)){
        gchar *word = "";
        if (line_regex && g_regex_match(line_regex, *pointer, 0, &info)){
            if (g_match_info_matches(info)){
                word = g_match_info_fetch(info, 0);
            }
        }
        gtk_list_store_insert_with_values(store, NULL, -1, 0, word, 1, *pointer, -1);
    }

Я хотел бы получить значение внутри группы, что означает следующую строку:

some-test:56:some-other-text

Я хотел бы получить 56. IПонятия не имею, как работает gtk, поэтому я немного ослеп, и ничего не нашел в документации.В python я бы использовал groups методы, поэтому здесь мне нужно что-то подобное.Не могли бы вы посоветовать мне, как его получить?

1 Ответ

1 голос
/ 05 августа 2011

Я нашел полезную информацию на странице g-match-info-fetch * gnome.org , которая указывает, что g_match_info_fetch(info, 0) возвращает все совпадение, которое для вашего ^ ... $ регулярного выражения является целой строкой. Код, показанный ниже (который похож на ваш код, за исключением того, что я заменил gtk_list_store вещи на printf) показывает, что g_match_info_fetch(info, 1) возвращает желаемое поле. Код отображает следующие 3 строки:

info 1 =   56,   info 0 = a-test:56:some-other-text
No match in b-test:283B:some-other-text
info 1 =  718,   info 0 = c-test:718:some-other-text

Вот код:

#include <string.h>
#include <gtk/gtk.h>
int main(void) {
  char *str = "a-test:56:some-other-text\nb-test:283B:some-other-text\nc-test:718:some-other-text\n";
  gchar **split = g_strsplit(str, "\n", 0);
  gchar **pointer = NULL;
  GRegex *line_regex = NULL;
  GMatchInfo *info = NULL;
  line_regex = g_regex_new("^.*:(\\d+):.*$", 0, 0, NULL);

  for (pointer = split; *pointer; pointer++)
    if (strlen(*pointer)) {
      if (line_regex && g_regex_match(line_regex, *pointer, 0, &info)) {
        if (g_match_info_matches(info)) {
          printf ("info 1 = %4s,   info 0 = %s\n",
              g_match_info_fetch(info, 1),
              g_match_info_fetch(info, 0));
        }
      } else
        printf ("No match in %s\n", *pointer);
    }
  return (0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...