在 C 中使用正则表达式进行模式匹配

Pattern match using regex in C

我正在尝试将用户输入与特定的预定义模式相匹配。情况是这样的:

假设用户输入:@myFrined messageToSend,它应该匹配:@[:word:] [:word:].

我现在尝试的是:

//get line from stdin
size_t len = 0;
size_t input_size;
char *command = NULL;

input_size = getline(&command, &len, stdin);

printf("Read %lu characters\n", input_size);
printf("Input: %s", command);

regex_t regex;

//predefine patterns
char* exit_command = "/exit";
char* login_command = "/login [:word:] [:word:]";
char* privmsg_command = "@[:word:] [:word:]";
char* register_command = "/register [:word:] [:word:]";

//pattern results: 0 match ||| 1 not a match
int pattern_command_exit;
int pattern_command_login;
int pattern_command_privmsg;
int pattern_command_register;

//test the input against the patters
pattern_command_exit = regcomp(&regex, exit_command, 0);
pattern_command_exit = regexec(&regex, command, 0, NULL, 0);

pattern_command_login = regcomp(&regex, login_command, 0);
pattern_command_login = regexec(&regex, command, 0, NULL, 0);

pattern_command_privmsg = regcomp(&regex, privmsg_command, 0);
pattern_command_privmsg = regexec(&regex, command, 0, NULL, 0);

pattern_command_register = regcomp(&regex, register_command, 0);
pattern_command_register = regexec(&regex, command, 0, NULL, 0);

//*******actual results*******// 
printf("/exit: %d\n", pattern_command_exit);
printf("/login: %d\n", pattern_command_login);
printf("/private message: %d\n", pattern_command_privmsg);
printf("/register: %d\n", pattern_command_register);

这仅适用于 /exit,这是有道理的,因为我在某处做错了。

知道如何正确使用正则表达式来匹配这些模式吗?

三个问题:

  1. 字符class名称需要用两边的括号括起来,例如[[:alpha:]].

  2. 即使语法正确,word 也不是有效字符 class,唯一有效的字符 class 是(来自 the manual page):

    alnum   digit   punct
    alpha   graph   space
    blank   lower   upper
    cntrl   print   xdigit
    
  3. 如果你想匹配相同class的多个字符,你还需要一个\+(转义后变成\+),例如"[[:alnum:]]\+".

您必须从中选择一个,或者如果 none 适合您的需要,只需使用自定义括号表达式,例如 [a-zA-z0-9_-]\+ 来匹配一个或多个字母数字字符(大写或更低)加上 -_.