2016-01-12 3 views
-8

Предположим, что мне приходится разбирать некоторые номера телефонов, которые могут иметь разные разделители.Поддерживает ли регулярное выражение функции strtok C?

Пример: 01/555555 01/555-5555

Могу ли я использовать strtok() в с и дать регулярное выражение в качестве параметра разделителя, который будет включать все различные возможные разделители?

+5

Что [Имеющаяся документация] (http://en.cppreference.com/w/c/string/byte/strtok) сказать? – DevSolar

+2

'man strtok' довольно всеобъемлющий .. –

+0

@DevSolar Извините, от имени ... Но я только что видел */c/* в url. –

ответ

1

Нет, он не поддерживает regex. Прочитайте документацию, прежде чем спрашивать. С другой стороны, это как раз то, как это работает снова Read the documentation, т. Е. Вы даете ему все возможные разделители.

Проверьте это здесь

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

int 
main(void) 
{ 
    char example[] = "[email protected]#ing"; 
    char *token; 
    char *pointer; 
    pointer = example; 
    token = strtok(pointer, "@#$"); 
    if (token == NULL) 
     return -1; 
    do 
    { 
     fprintf(stdout, "%s\n", token); 
     pointer = NULL; 
    } while ((token = strtok(NULL, "@#$")) != NULL); 

} 
+0

Вы даже можете измените разделители во время разбора. – fuz

-1

В дополнение к ответу iharob, в sscanf иногда может быть альтернативой strtok. Вот иллюстрация с данным примером:

#include <stdio.h> 

int main(void) { 
    const char *s = "01/555555 01/555-5555"; 
    int a, b, c, d, e; 

    int ret = sscanf(s, "%02d/%d %02d/%d-%d", &a, &b, &c, &d, &e); 
    if (ret != 5) { 
     printf("The string is in bad format.\n"); 
    } else { 
     printf("%02d/%d %02d/%d-%d\n", a, b, c, d, e); 
    } 

    return 0; 
} 

Как strtok, он не поддерживает регулярные выражения, но это позволяет извлекать данные в одной строки. Он работает точно так же, как scanf, но он считывает из заданной строки вместо чтения со стандартного ввода.

http://linux.die.net/man/3/sscanf

+0

Я не понимаю downvotes – mikedu95

+0

, если вы утверждаете, что sscanf способен поддерживать регулярное выражение (по крайней мере, это то, о чем попросили). Затем дайте объяснение, как ваш код это делает. Поскольку я не могу видеть, как это реализует любую поддержку регулярных выражений. Вот почему я ниспровергаю. – dhein

+0

Хорошо, я понимаю. Мой ответ выглядит так, как будто я утверждал, что sscanf поддерживает регулярное выражение, тогда как это дополнение к первому ответу, но это было неясно. Однако мой код ясно показывает, что я не утверждаю, что sscanf поддерживает регулярное выражение, потому что в коде нет никакого регулярного выражения. Я отредактирую свой ответ в соответствии с вашими замечаниями. Благодарю. – mikedu95

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