C中的正则expression式:例子?

我在一些简单的例子和​​如何在ANSI C中使用正则expression式的最佳做法man regex.h没有提供太多的帮助。

正则expression式实际上不是ANSI C的一部分。听起来好像你可能正在谈论POSIX正则expression式库,它带有大多数(所有?)* nixes。 下面是一个在C中使用POSIX正则expression式的例子(基于这个 ):

 #include <regex.h> regex_t regex; int reti; char msgbuf[100]; /* Compile regular expression */ reti = regcomp(&regex, "^a[[:alnum:]]", 0); if (reti) { fprintf(stderr, "Could not compile regex\n"); exit(1); } /* Execute regular expression */ reti = regexec(&regex, "abc", 0, NULL, 0); if (!reti) { puts("Match"); } else if (reti == REG_NOMATCH) { puts("No match"); } else { regerror(reti, &regex, msgbuf, sizeof(msgbuf)); fprintf(stderr, "Regex match failed: %s\n", msgbuf); exit(1); } /* Free memory allocated to the pattern buffer by regcomp() */ regfree(&regex); 

或者,您可能想要查看PCRE ,这是一个用C语言编写的兼容Perl的正则expression式库.Perl语法与Java,Python和其他一些语言中使用的语法几乎相同。 POSIX语法是grepsedvi等使用的语法

这可能不是你想要的,但是一个像re2c这样的工具可以将ANSI-C的POSIX(-ish)正则expression式编译成它作为lex的替代品,但是这种方法允许你牺牲最后一点速度的灵活性和可读性,如果你真的需要它。

man regex.h报告没有手动inputregex.h,但man 3 regex为您提供了一个解释模式匹配POSIX函数的页面。
在“GNU C库:正则expression式匹配”中描述了相同的function,其中解释了GNU C库支持POSIX.2接口和GNU C库多年以来的接口。

例如,对于打印哪个作为parameter passing的string的假想程序,匹配作为第一个parameter passing的模式,可以使用类似于以下代码的代码。

 #include <errno.h> #include <regex.h> #include <stdio.h> #include <stdlib.h> #include <string.h> void print_regerror (int errcode, size_t length, regex_t *compiled); int main (int argc, char *argv[]) { regex_t regex; int result; if (argc < 3) { // The number of passed arguments is lower than the number of // expected arguments. fputs ("Missing command line arguments\n", stderr); return EXIT_FAILURE; } result = regcomp (&regex, argv[1], REG_EXTENDED); if (result) { // Any value different from 0 means it was not possible to // compile the regular expression, either for memory problems // or problems with the regular expression syntax. if (result == REG_ESPACE) fprintf (stderr, "%s\n", strerror(ENOMEM)); else fputs ("Syntax error in the regular expression passed as first argument\n", stderr); return EXIT_FAILURE; } for (int i = 2, i < argc, i++) { result = regexec (&regex, argv[i], 0, NULL, 0); if (!result) { printf ("'%s' matches the regular expression\n", argv[i]); } else if (result == REG_NOMATCH) { printf ("'%s' doesn't the regular expression\n", argv[i]); } else { // The function returned an error; print the string // describing it. // Get the size of the buffer required for the error message. size_t length = regerror (result, &regex, NULL, 0); print_regerror (result, length, &regex); return EXIT_FAILURE; } } /* Free the memory allocated from regcomp(). */ regfree (&regex); return EXIT_SUCCESS; } void print_regerror (int errcode, size_t length, regex_t *compiled) { char buffer[length]; (void) regerror (errcode, compiled, buffer, length); fprintf(stderr, "Regex match failed: %s\n", buffer); } 

regcomp()的最后一个参数至less需要REG_EXTENDED ,否则函数将使用基本的正则expression式 ,这意味着(例如)您需要使用a\{3\}而不是从扩展中使用a{3} 正则expression式 ,这可能是你期望使用的。

POSIX.2还有另一个通配符匹配function: fnmatch() 。 它不允许编译正则expression式,也不允许匹配子expression式的子string,但它是非常具体的检查一个文件名匹配通配符(例如它使用FNM_PATHNAME标志)。