c - 正则表达式获取 C 语言的完整名称

标签 c regex

我需要使用 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/

相关文章:

检查数组中两个字符串的相等性并更改其中之一的内容

c - 当字符串太短时,为什么 popt 会出现段错误?

asp.net - asp :RegularExpressionValidator, 确保字符串中没有逗号

javascript - 正则表达式测试函数不返回相同的依赖引号

javascript - 正则表达式匹配特定标记之前的所有字符

c - union 中有指针和非指针数据类型是否有效?

c - 在 Linux PCI 驱动程序中向设备添加多个属性

更改节点 libxml2 的命名空间

javascript - 正则表达式匹配唯一结果

regex - 清空 $1 和 $2 值 Regex Perl