我需要使用 C 正则表达式
从 Java 日志中获取客户端名称。
我已经测试了这个正则表达式Client:\\s[a-zA-Z\\s]+
here并且工作正常。
但在我的 C
程序中,不需要。
#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
regex_t preg;
const char *string =
"[com.example.app.JavaClass.JavaMethod(JavaClass.java:1)] (Thread-1) - "
"Client: FirstName MiddleName AnotherName LastName, Wallet: WL01, "
"Agency: 9999, ID: 06611486123, Ticket: TKR211";
const char *pattern = "Client:\\s[a-zA-Z\\s]+";
size_t nmatch = 1;
regmatch_t pmatch[1];
regcomp(&preg, pattern, REG_ICASE | REG_EXTENDED);
int ret = regexec(&preg, string, nmatch, pmatch, 0);
char *match = calloc(pmatch[0].rm_eo - pmatch[0].rm_so, sizeof(char));
memcpy(match, &string[pmatch[0].rm_so], pmatch[0].rm_eo - pmatch[0].rm_so);
printf("ret: %d\n", ret);
printf("rm_eo0: %d\n", pmatch[0].rm_eo);
printf("rm_so0: %d\n", pmatch[0].rm_so);
printf("Match: %s\n", match);
regfree(&preg);
return 0;
}
$ gcc -Wall -Wextra -Wwrite-strings reg.c && ./a.out
当我执行此命令时,我得到以下输出:
ret: 0
rm_eo0: 87
rm_so0: 70
Match: Client: FirstName
我做错了什么?
最佳答案
您需要将括号表达式内的 \s
替换为 [:space:]
POSIX 字符类:
const char *pattern = "Client:\\s[a-zA-Z[:space:]]+";
请参阅online demo .
此行为的原因是 POSIX 正则表达式风格不允许简写字符类,例如 \s
、\w
等在括号表达式内, [\s]
模式与 POSIX ERE 中的反斜杠或 s
字符匹配(通过 REG_EXTENDED
标志启用)。 POSIX 字符类应该在括号表达式内使用,它们弥补了这个缺点。
关于c - 正则表达式获取 C 语言的完整名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68491615/