在 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(®ex, exit_command, 0);
pattern_command_exit = regexec(®ex, command, 0, NULL, 0);
pattern_command_login = regcomp(®ex, login_command, 0);
pattern_command_login = regexec(®ex, command, 0, NULL, 0);
pattern_command_privmsg = regcomp(®ex, privmsg_command, 0);
pattern_command_privmsg = regexec(®ex, command, 0, NULL, 0);
pattern_command_register = regcomp(®ex, register_command, 0);
pattern_command_register = regexec(®ex, 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
,这是有道理的,因为我在某处做错了。
知道如何正确使用正则表达式来匹配这些模式吗?
三个问题:
字符class名称需要用两边的括号括起来,例如[[:alpha:]]
.
即使语法正确,word
也不是有效字符 class,唯一有效的字符 class 是(来自 the manual page):
alnum digit punct
alpha graph space
blank lower upper
cntrl print xdigit
如果你想匹配相同class的多个字符,你还需要一个\+
(转义后变成\+
),例如"[[:alnum:]]\+"
.
您必须从中选择一个,或者如果 none 适合您的需要,只需使用自定义括号表达式,例如 [a-zA-z0-9_-]\+
来匹配一个或多个字母数字字符(大写或更低)加上 -
和 _
.
我正在尝试将用户输入与特定的预定义模式相匹配。情况是这样的:
假设用户输入:@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(®ex, exit_command, 0);
pattern_command_exit = regexec(®ex, command, 0, NULL, 0);
pattern_command_login = regcomp(®ex, login_command, 0);
pattern_command_login = regexec(®ex, command, 0, NULL, 0);
pattern_command_privmsg = regcomp(®ex, privmsg_command, 0);
pattern_command_privmsg = regexec(®ex, command, 0, NULL, 0);
pattern_command_register = regcomp(®ex, register_command, 0);
pattern_command_register = regexec(®ex, 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
,这是有道理的,因为我在某处做错了。
知道如何正确使用正则表达式来匹配这些模式吗?
三个问题:
字符class名称需要用两边的括号括起来,例如
[[:alpha:]]
.即使语法正确,
word
也不是有效字符 class,唯一有效的字符 class 是(来自 the manual page):alnum digit punct alpha graph space blank lower upper cntrl print xdigit
如果你想匹配相同class的多个字符,你还需要一个
\+
(转义后变成\+
),例如"[[:alnum:]]\+"
.
您必须从中选择一个,或者如果 none 适合您的需要,只需使用自定义括号表达式,例如 [a-zA-z0-9_-]\+
来匹配一个或多个字母数字字符(大写或更低)加上 -
和 _
.