C中的正则表达式没有像我预期的那样工作



我在regex检查器网站上测试了这个正则表达式,结果是匹配的,但当我试图在c中实现逻辑时,我没有得到匹配。为什么Ba-9与正则表达式不匹配,即使它应该匹配。

#include <stdio.h>
#include <regex.h>
int isReserved(char* ptr, char* reserved){ //0 is false and 1 is true for bool
int i = 0;
while (ptr[i] != '') {
if (ptr[i] == reserved[i]) {
i++;
} else
return 0;
}
if(reserved[i] != '')
return 0;
return 1;
}
int isTAGS(char* ptr){
char* arr = "TAGS";
return isReserved(ptr, arr);
}
int isBEGIN(char* ptr){
char* arr = "BEGIN";
return isReserved(ptr, arr);
}
int isSEQUENCE(char* ptr){
char* arr = "SEQUENCE";
return isReserved(ptr, arr);
}
int isINTEGER(char* ptr){
char* arr = "INTEGER";
return isReserved(ptr, arr);
}
int isDATE(char* ptr){
char* arr = "DATE";
return isReserved(ptr, arr);
}
int isEND(char* ptr){
char* arr = "END";
return isReserved(ptr, arr);
}

int main() {
regex_t regex;
int value;
//    regcomp(&regex,"^[A-Z](([0-9a-zA-Z]*-[0-9a-zA-Z]*)*+[0-9a-zA-Z]*)*",0);
regcomp(&regex,"^[A-Z](([0-9a-zA-Z]*-[0-9a-zA-Z]*)*[0-9a-zA-Z]*)*",0);
value = regexec(&regex, "Ba-9", 0, NULL, 0);
printf("%i", value); //0 is a regex match
return 0;
}

//    char* string = "END";
//    printf("%i",isEND(string));

请尝试以下操作:

#include <stdio.h>
#include <string.h>
#include <regex.h>
int main() {
regex_t regex;
int value;
char str[BUFSIZ];
FILE *fp;
if (NULL == (fp = fopen("test.txt", "r"))) {                        // read a test file "test.txt"
perror("test.txt");
exit(1);
}
regcomp(&regex, "^[A-Z]([0-9a-zA-Z]*-[0-9a-zA-Z]+)*([0-9a-zA-Z]*-[0-9a-zA-Z]*[0-9]+[0-9a-zA-Z]*|[0-9a-zA-Z]*[0-9]+[0-9a-zA-Z]*-[0-9a-zA-Z]+)+(-[0-9a-zA-Z])*$", REG_EXTENDED);
while (NULL != (fgets(str, BUFSIZ, fp))) {                          // loop over each line
str[strcspn(str, "n")] = 0;                                    // remove trailing newline character
value = regexec(&regex, str, 0, NULL, 0);                       // test the regex
printf("%-10s: %sn", str, value ? "no match" : "match");       // show the result
}
fclose(fp);
return 0;
}

test.txt:

Ba-9
Ba
B9-
B-9
B--9
B9--
B-9-
B-9-9
B-9-a
B01-2
B1a-2
B1-A
B-A
BA1-2
BA1-a
BA-2
B-A-2
B-2
B-2a

执行结果:

Ba-9      : match
Ba        : no match
B9-       : no match
B-9       : match
B--9      : no match
B9--      : no match
B-9-      : no match
B-9-9     : match
B-9-a     : match
B01-2     : match
B1a-2     : match
B1-A      : match
B-A       : no match
BA1-2     : match
BA1-a     : match
BA-2      : match
B-A-2     : match
B-2       : match
B-2a      : match

[解释]

让我将[0-9a-zA-Z]简化为w,将[0-9]简化为d,仅用于解释目的,尽管C regex接受这些不足之处
然后regex

^[A-Z]([0-9a-zA-Z]*-[0-9a-zA-Z]+)*([0-9a-zA-Z]*-[0-9a-zA-Z]*[0-9]+[0-9a-zA-Z]*|[0-9a-zA-Z]*[0-9]+[0-9a-zA-Z]*-[0-9a-zA-Z]+)+(-[0-9a-zA-Z])*$

可以缩写为:

^[A-Z](w*-w+)*(w*-w*d+w*|w*d+w*-w+)+(-w)*$

这将更加清晰。

  • 最重要的部分是(w*-w*d+w*|w*d+w*-w+)+CCD_ 7或CCD_。本部分确保字符串包含至少一个数字和至少一个连字符,以及由于开头的正则表达式CCD_ 9而导致的一个字母
  • 中间表达式CCD_ 10和CCD_由字母数字字符和连字符组成的子字符串
  • 每个子表达式都不允许以hypen结尾,防止从匹配两个或多个连续连字符和/或字符串的末尾

最新更新