2016-12-28 2 views
1

У меня есть группа чисел, которые начинаются с строкой, внутри строки в C:РегВыра в C: соответствует цифре после <n> повторений

intr 250727985 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 238463729 0 0 0 0 0 8510 1009565 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 75963 0 0 0 0 0 0 0 0 0 0 0 0 0 6416543 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29812 197 0 0 0 0 842664 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

я хочу, чтобы захватить (матч) только 26-й позиции из них (желательно матч:. 1009565 по возвращению)

я попробовал этот шаблон:

(?:[0-9]+[[:space:]]){26}(?<![0-9]) 

, но это захватывает всю строку до нужной позиции. Как это сделать с помощью RegExp в C? кто-то может предоставить образец источника?

RegExp - это самый быстрый (и самый легкий из системных ресурсов) способ сделать это? Мне нужно повторять эту операцию раз в секунду, все время безотказной работы.

Я смущен о том, как это сделать.

+2

Зачем использовать RegExp, когда у вас есть полнофункциональный язык программирования для работы с. Другими словами, просто используйте 'strtok'. – user3386109

+0

В regex go, ** (?: ([0-9] +) \ s) {26} ** https://regex101.com/r/7Lo4vh/1 –

ответ

3

Я считаю, что использование RegExp затруднит задачу, как это было предложено другими, используя strtok намного проще.

Вы можете разобрать строку в каждом пространстве и сопоставить шаблон, который вы пытаетесь найти, используя strcmp от <string.h>.

Вот основная идея о том, что вы можете использовать:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *string_search(char *string, unsigned position); 

int main(void) { 
    char string[] = "250727985 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 238463729 0 0 0 0 0 8510 1009565 0 0 0 0 0"; 
    char *check; 
    unsigned position = 26; 

    check = string_search(string, position); 

    if (check != NULL) { 
     printf("String %s found in position %d.\n", check, position); 
    } else { 
     printf("No string found in position %d.\n", position); 
    } 

    return 0; 
} 

char *string_search(char *string, unsigned position) { 
    char *number; 
    const char *delim = " "; 
    unsigned pos_count = 1; 

    number = strtok(string, delim); 
    while (number != NULL) { 
     if (pos_count == position) { 
      return number; 
     } 
     pos_count++; 
     number = strtok(NULL, delim); 
    } 
    return NULL; 
} 
+0

Эта программа предназначена для доказательства существования известных номеров. ОП хочет найти номер n {count}! –

+0

'Я хочу захватить (совместить) только 26-ю позицию из них (желаемое совпадение: 1009565 по моему возвращению.)' –

+0

@RoadRunner я пытался ответить раньше, но по какой-то причине я не мог и ваше сообщение исчезло. Отвечая на вопрос: Да, это содержимое в массиве упростит получение желаемого значения, моя основная идея в использовании RegExp заключается в следующем: чтобы сохранить память и системные ресурсы, это будет интенсивно работать в процессоре рук – eduardogarcia234

0

В библиотеке строк Unix есть strtok, которая делит строку на токены с учетом разделителя. Вы должны иметь возможность просто перебирать строку, пока не дойдете до требуемой позиции.

Обсуждение переполнения стека strtok находится на Using strtok in c, у которого есть пример кода и gotchas.

+0

всегда я искал регулярное выражение в некоторые сценарии (например, форматирование XML и содержимого HTML, фильтрация данных какого-либо типа), я читал, как это может быть неточным или может иногда не срабатывать, поэтому я снова в такой ситуации – eduardogarcia234

+0

и, конечно же, благодарю вас за ваши отзывы, я посмотрю на это – eduardogarcia234

Смежные вопросы