【问题标题】:Escaping '{' and '}' in regex for C在 C 的正则表达式中转义“{”和“}”
【发布时间】:2021-05-12 18:07:03
【问题描述】:

我想在 C 中使用以下正则表达式 \{.+\}。例如,{HELLO} 有效,但 HELLO}2{HELLOHELLO 无效。

我正在使用 POSIX 正则表达式库 regex.h。

但是,我在输入 "\\{.+\\}" 时收到 regcomp 错误 13,而 "\{.+\}" 给了我一个未知转义序列警告

#include <regex.h>

int main()
{
    regex_t regex_enclosed;
    char* pattern_enclosed = "\\{.+\\}";

    // regex is not compiling but returning error code 13
    regcomp(&regex_enclosed, pattern_enclosed, 0);

    return 0;
}

有没有办法解决这个问题?好像我没有转义 {},模式编译不正确。

【问题讨论】:

标签: c regex glibc


【解决方案1】:

您必须使用REG_EXTENDED 标志来编译扩展正则表达式。基本的正则表达式不是很直观,而且大多已经过时了。此外,您希望最短的匹配只匹配"{HOME}/{DATE}" 中的{HOME}

regex_t regex_enclosed;
const char *pattern_enclosed = "\\{[^}]+\\}";  // can also use "[{][^}]+[}]"
int res = regcomp(&regex_enclosed, pattern_enclosed, REG_EXTENDED);

【讨论】:

  • 非常感谢!超级有用,现在可以使用了:) 是的,我还希望正则表达式与您的示例中的 {HOME} 匹配
【解决方案2】:

没有REG_EXTENDED,您使用的是POSIX BRE。您仍然可以使用 POSIX BRE,只需:

  • 不要转义大括号
  • 使用 Kleene 星形 * 而不是 ++ 匹配 POSIX BRE 中的 +
  • 但使用否定括号表达式来匹配大括号之间的文本。

使用

regex_t regex_enclosed;
const char *pattern_enclosed = "{[^{}]*}";
int res = regcomp(&regex_enclosed, pattern_enclosed, 0);

解释

--------------------------------------------------------------------------------
  {                        '{'
--------------------------------------------------------------------------------
  [^{}]*                   any character except: '{', '}' (0 or more
                           times (matching the most amount possible))
--------------------------------------------------------------------------------
  }                        '}'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-31
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多