有没有一种方法可以使用C代码验证正则表达式模式的语法

时间:2019-02-01 11:19:21

标签: c

正则表达式模式为:

enter image description here

但是它不是有效的模式,因为语法错误(在2个位置的*前面应有一个。)

正确的格式是:

enter image description here

有没有办法在C编程中验证这些正则表达式模式的语法? 是否有任何库或函数会评估上述错误模式并返回无效模式? 我尝试使用regcomp(但是对于错误的输入,它没有返回无效的模式)

3 个答案:

答案 0 :(得分:0)

您可能想花钱,用库在C语言中进行操作,或者查看这些实时测试工具https://regex101.com/https://www.debuggex.com/

答案 1 :(得分:0)

有一些可用于c的正则表达式库(请参见Regular expressions in C: examples?)。 当您要查找给定的字符串是否具有有效的正则表达式格式时,可以使用另一个正则表达式(请参见Is there a regular expression to detect a valid regular expression?),也可以尝试将字符串“编译”为正则表达式。我认为第一种方法是更清洁的方法。

答案 2 :(得分:0)

这取决于您使用的正则表达式实现。这是一个使用POSIX扩展正则表达式的示例,该示例仅检查regcomp的返回值并打印通过regerror获得的错误消息:

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

void test(const char *regex) {
	regex_t preg;
	int errcode = regcomp(&preg, regex, REG_EXTENDED);
	if (errcode == 0) {
		printf("%s => Success\n", regex);
		regfree(&preg);
	}
	else {
		char errmsg[80];
		regerror(errcode, NULL, errmsg, 80);
		printf("%s => %s\n", regex, errmsg);
	}
}

int main() {
	test("(*\\.com)");
	test("(.*\\.com)");
	return 0;
}

Try it online!

这应该打印如下内容:

(*\.com) => Invalid preceding regular expression
(.*\.com) => Success

请注意,(*\.com)是有效的POSIX basic 正则表达式,因为未转义的(与文字(匹配。对于基本正则表达式,正则表达式或带括号的子表达式开头的*也会与文字*匹配。