Как использовать Regex для проверки ввода данных с клавиатуры на реальные числа с C языками? - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь исследовать REGEX в C и пытаюсь понять, но у меня проблемы с шаблоном строкового типа. В этой программе я хочу убедиться, что вводимая строка является числом (только цифрами, а не символами, пробелами или специальными символами)

 #include<stdio.h>
 #include <regex.h> 
 void print_result(int return_value){
  if (return_value == 0){
    printf("Pattern found.\n");
  }
  else if (return_value == REG_NOMATCH){
    printf("Pattern not found.\n");
  }
  else{
    printf("An error occured.\n");
  }
}
int main() {
  regex_t regex;
  int return_value;
  int return_value2;
  return_value = regcomp(&regex,"[^a-fA-F_][0-9]+",0);
  return_value = regexec(&regex, "4324", 0, NULL, 0);
  return_value2 = regcomp(&regex,"\d+",0);
  return_value = regexec(&regex, "4324", 0, NULL, 0);
  print_result(return_value);  //not found
  print_result(return_value); //no found
  print_result(return_value2);
  return 0;
}

Можете ли вы дать мне несколько идей для проверки ввода. Я хочу найти другой способ без использования значений ASCII

1 Ответ

2 голосов
/ 29 мая 2020

Если вы укажете флаги как 0 в regcomp:

return_value = regcomp(&regex,"[^a-fA-F_][0-9]+",0);

, тогда вы принимаете синтаксис регулярного выражения по умолчанию, который является так называемым Basi c Regular Expression (BRE ) . Единственное разумное, что можно сказать о BRE, - это «не использовать их». Всегда указывайте флаг REG_EXTENDED (по крайней мере), и тогда вы будете работать с синтаксисом регулярных выражений, который хотя бы имеет некоторое сходство с тем, что вы ожидаете. (В противном случае в ваших строках будет преобладать то, что технически называется «наклонная древесина»: \ символов, которые включают метасимволы в регулярном выражении, и более \ символов, так что \ символы, которые вам нужны, не будут рассматриваться как escape-символы в строка символов.)

Посмотрите man regexe c и man 7 regex для получения дополнительных сведений. Убедитесь, что вы внимательно прочитали вторую ссылку (хотя вы можете игнорировать синтаксис регулярных выражений basi c :-)), потому что в более современных библиотеках регулярных выражений есть много часто используемых синтаксисов, которых нет в регулярных выражениях Posix, даже не расширенных. (Это включает \d, используемый во втором регулярном выражении. Posix имеет именованные классы символов, например [[:digit:]].)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...