我在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(®ex,"^[A-Z](([0-9a-zA-Z]*-[0-9a-zA-Z]*)*+[0-9a-zA-Z]*)*",0);
regcomp(®ex,"^[A-Z](([0-9a-zA-Z]*-[0-9a-zA-Z]*)*[0-9a-zA-Z]*)*",0);
value = regexec(®ex, "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(®ex, "^[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(®ex, 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结尾,防止从匹配两个或多个连续连字符和/或字符串的末尾