c - C 中的正则表达式(使用 regex.h)用于识别罗马数字

标签 c regex roman-numerals

使用这段代码,我创建了一个函数,它接受一个字符串并检查它是否对应于一个罗马数字(从 this thread 中启发自己)

int checkregex(char *in){
regex_t regex;
char *expression="^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$";
int reti;
char msgbuf[100];

/* Compile regular expression */
reti = regcomp(&regex, expression, 0);
if (reti) {
    fprintf(stderr, "Could not compile regex\n");
    exit(1);
}

/* Execute regular expression */
reti = regexec(&regex, in , 0, NULL, 0);
if (!reti) {
    printf("Match\n");
    return 1;
}
else if (reti == REG_NOMATCH) {
    printf("No match\n");
    return 0;
}
else {
    regerror(reti, &regex, msgbuf, sizeof(msgbuf));
    fprintf(stderr, "Regex match failed: %s\n", msgbuf);
    exit(1);
}
return 0;

我的问题是它总是返回“不匹配”,所以我想知道我的正则表达式是否与 POSIX 不兼容,或者我是否遗漏了其他东西......

有人能帮帮我吗?

最佳答案

您需要添加 REG_EXTENDED 标志,因为您正在使用限制量词而不转义大括号和开始/结束字符串 anchor 。

参见 IDEONE demo :

#include <regex.h>
#include <stdio.h>

int checkregex(char *in){
  regex_t regex;
  char *expression="^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$";
  int reti;
  char msgbuf[100];

  /* Compile regular expression */
  reti = regcomp(&regex, expression, REG_EXTENDED);
  if (reti) {
    fprintf(stderr, "Could not compile regex\n");
    return -1;
  }

  /* Execute regular expression */
  reti = regexec(&regex, in , 0, NULL, 0);
  if (!reti) {
    printf("Match\n");
    return 1;
  }
  else if (reti == REG_NOMATCH) {
    printf("No match\n");
    return 0;
  }
  else {
    regerror(reti, &regex, msgbuf, sizeof(msgbuf));
    fprintf(stderr, "Regex match failed: %s\n", msgbuf);
    exit(1);
  }
  return 0;
}

int main(void) { 
    int x = checkregex("XII");
    printf("%d\n", x);
    return 0;
}

关于c - C 中的正则表达式(使用 regex.h)用于识别罗马数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33617836/

相关文章:

c++ - 应用编译器选项 -00 与 -03 在 clang 上调用 malloc 的不同输出

objective-c - Objective C 数字转罗马数字

c - 如何用 C 语言将矩阵 3x3 乘以 3x1

c - 函数未在此范围内声明

c - 使用 __attribute__((packed)) 在 c 中避免结构填充

javascript - 获取代数项的系数

Java 正则表达式错误 - 没有第 1 组

regex - 生成基于正则表达式的字符串的所有可能组合的列表

javascript - 在 JavaScript 中将数字转换为罗马数字

Python-将罗马数字转换为整数