C 中的正则表达式(使用 regex.h)用于识别罗马数字
regex in C (using regex.h) for roman numbers recognition
使用这段代码,我创建了一个函数,它接受一个字符串并检查它是否对应于一个罗马数字(从 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(®ex, expression, 0);
if (reti) {
fprintf(stderr, "Could not compile regex\n");
exit(1);
}
/* Execute regular expression */
reti = regexec(®ex, 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, ®ex, msgbuf, sizeof(msgbuf));
fprintf(stderr, "Regex match failed: %s\n", msgbuf);
exit(1);
}
return 0;
}
我的问题是它总是 return "No match",所以我想知道我的正则表达式是否与 POSIX 不兼容,或者我是否遗漏了其他东西...
有人可以帮我吗?
您需要添加 REG_EXTENDED
标志,因为您使用的是没有转义大括号和 start/end 字符串锚点的限制量词。
查看 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(®ex, expression, REG_EXTENDED);
if (reti) {
fprintf(stderr, "Could not compile regex\n");
return -1;
}
/* Execute regular expression */
reti = regexec(®ex, 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, ®ex, 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;
}
使用这段代码,我创建了一个函数,它接受一个字符串并检查它是否对应于一个罗马数字(从 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(®ex, expression, 0);
if (reti) {
fprintf(stderr, "Could not compile regex\n");
exit(1);
}
/* Execute regular expression */
reti = regexec(®ex, 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, ®ex, msgbuf, sizeof(msgbuf));
fprintf(stderr, "Regex match failed: %s\n", msgbuf);
exit(1);
}
return 0;
}
我的问题是它总是 return "No match",所以我想知道我的正则表达式是否与 POSIX 不兼容,或者我是否遗漏了其他东西...
有人可以帮我吗?
您需要添加 REG_EXTENDED
标志,因为您使用的是没有转义大括号和 start/end 字符串锚点的限制量词。
查看 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(®ex, expression, REG_EXTENDED);
if (reti) {
fprintf(stderr, "Could not compile regex\n");
return -1;
}
/* Execute regular expression */
reti = regexec(®ex, 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, ®ex, 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;
}