为了账号安全,请及时绑定邮箱和手机立即绑定

C中的正则表达式:示例?

/ 猿问

C中的正则表达式:示例?

C中的正则表达式:示例?

下面是一些关于如何在ANSI C中使用正则表达式的简单示例和最佳实践。man regex.h并没有提供那么多帮助。



查看完整描述

3 回答

?
宝慕林4294392

正则表达式实际上不是ANSI C的一部分,听起来您可能在谈论POSIX正则表达式库,它附带了大多数(所有?)*nix。下面是一个在C中使用POSIX正则表达式的示例(基于这,这个):

#include <regex.h>        regex_t regex;int reti;char msgbuf[100];/* Compile regular expression */reti = regcomp(&regex, "^a[[:alnum:]]", 0);if (reti) {
    fprintf(stderr, "Could not compile regex\n");
    exit(1);}/* Execute regular expression */reti = regexec(&regex, "abc", 0, NULL, 0);if (!reti) {
    puts("Match");}else if (reti == REG_NOMATCH) {
    puts("No match");}else {
    regerror(reti, &regex, msgbuf, sizeof(msgbuf));
    fprintf(stderr, "Regex match failed: %s\n", msgbuf);
    exit(1);}/* Free memory allocated to the pattern buffer by regcomp() */regfree(&regex);

或者,您可能想要退房。PCRE中与Perl兼容的正则表达式库。Perl语法与Java、Python和许多其他语言中使用的语法基本相同。POSIX语法是grepsedvi


查看完整回答
反对 回复 2019-06-27
?
慕娘9325324

可能不是你想要的,而是像第2c条可以将POSIX(-ISH)正则表达式编译为ANSI C。lex,但这种方法允许您牺牲灵活性和可读性来换取最后一点的速度,如果您真的需要的话。


查看完整回答
反对 回复 2019-06-27
?
慕容3067478

man regex.h报告中没有regex.h的手动条目,但是man 3 regex为您提供一个页面,解释用于模式匹配的POSIX函数。
相同的功能在GNU C库:正则表达式匹配,这说明GNU C库支持POSIX.2接口和GNU C库多年来一直使用的接口。

例如,对于一个假设的程序,它打印作为参数传递的哪个字符串与作为第一个参数传递的模式相匹配,您可以使用与下面的代码类似的代码。

#include <errno.h>#include <regex.h>#include <stdio.h>#include <stdlib.h>#include <string.h>void print_regerror (int errcode, size_t length, regex_t *compiled);intmain (int argc, char *argv[]){
  regex_t regex;
  int result;

  if (argc < 3)
    {
      // The number of passed arguments is lower than the number of
      // expected arguments.
      fputs ("Missing command line arguments\n", stderr);
      return EXIT_FAILURE;
    }

  result = regcomp (&regex, argv[1], REG_EXTENDED);
  if (result)
    {
      // Any value different from 0 means it was not possible to 
      // compile the regular expression, either for memory problems
      // or problems with the regular expression syntax.
      if (result == REG_ESPACE)
        fprintf (stderr, "%s\n", strerror(ENOMEM));
      else
        fputs ("Syntax error in the regular expression passed as first argument\n", stderr);
      return EXIT_FAILURE;               
    }
  for (int i = 2; i < argc; i++)
    {
      result = regexec (&regex, argv[i], 0, NULL, 0);
      if (!result)
        {
          printf ("'%s' matches the regular expression\n", argv[i]);
        }
      else if (result == REG_NOMATCH)
        {
          printf ("'%s' doesn't the regular expression\n", argv[i]);
        }
      else
        {
          // The function returned an error; print the string 
          // describing it.
          // Get the size of the buffer required for the error message.
          size_t length = regerror (result, &regex, NULL, 0);
          print_regerror (result, length, &regex);       
          return EXIT_FAILURE;
        }
    }

  /* Free the memory allocated from regcomp(). */
  regfree (&regex);
  return EXIT_SUCCESS;}voidprint_regerror (int errcode, size_t length, regex_t *compiled){
  char buffer[length];
  (void) regerror (errcode, compiled, buffer, length);
  fprintf(stderr, "Regex match failed: %s\n", buffer);}

最后的论点regcomp()至少需要REG_EXTENDED,否则这些函数将使用基本正则表达式,这意味着(例如)您需要使用a\{3\}而不是a{3}用自扩展正则表达式,这可能就是你期望使用的。

POSIX.2还有另一个用于通配符匹配的功能:fnmatch()..它不允许编译正则表达式,也不允许获得匹配子表达式的子表达式,但是它对于检查文件名何时匹配通配符(例如,它使用FNM_PATHNAME国旗)


查看完整回答
反对 回复 2019-06-27

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信