如何转义c中正则表达式字符组中的连字符

问题描述 投票:0回答:1

我有一个 C 程序来编译正则表达式,它看起来像:

   regex_t re;

   if (regcomp(&re, "^[a-z0-9\\-#_]+$",REG_EXTENDED) != 0) {
      printf("Error compiling %s\n");
   }

基本上,我想将任何内容与一系列小写字符、数字、破折号、散列或下划线相匹配。 似乎上面的操作由于破折号而失败了:

Error compiling ^[a-zA-Z0-9\-#_]+$

根据我能找到的所有文档,在 posix 扩展正则表达式中,您应该能够转义字符组中的

-
,但由于某种原因,这似乎在我的试验中不起作用。 我还尝试了双重转义(
"^[a-z0-9\\\\-#_]+$"
),它产生了相同的结果。 我知道我可以将破折号放在字符组的末尾而不转义,但我想知道如果它位于字符组的中间如何正确转义。

c regex
1个回答
0
投票

根据我能找到的所有文档,在 posix 扩展正则表达式中,您应该能够在字符组中转义 - ......

这是不正确的。来自 POSIX 9.3.5 RE 括号表达式...

特殊字符“.”、“*”、“[”和“\”(分别为 、 、 和 )在方括号表达式中将失去其特殊含义。

我知道我可以将破折号放在字符组的末尾而不转义,但我想知道如果它位于字符组的中间如何正确转义。

没有。您必须使用解析规则,如下所述。

如果该字符出现在列表中的第一个(在初始“^”之后,如果有)或最后一个,或者作为范围表达式中的结束范围点,则该字符应被视为自身。例如,表达式“[-ac]”和“[ac-]”是等效的,并且匹配任何字符“a”、“c”或“-”; “[^-ac]”和“[^ac-]”是等价的,匹配除“a”、“c”或“-”之外的任何字符;表达式“[%--]”匹配“%”和“-”之间的任何字符(包括“%”和“-”);表达式“[--@]”匹配“-”和“@”之间的任何字符(包括“-”和“@”);并且表达式“[a--@]”无效或等同于“@”,因为在 POSIX 语言环境中字母“a”位于符号“-”之后。要使用 a 作为起始范围点,它应位于括号表达式的第一位或指定为整理符号;例如,“[][.-.]-0]”,它匹配一个或任何在 0 和 0 之间进行排序的字符或排序元素。

如果括号表达式同时指定“-”和“]”,则在括号表达式中,“]”应放在前面(在“^”之后,如果有),“-”放在最后。

真是一场噩梦。最简单的方法就是将破折号放在前面或后面。

POSIX 正则表达式非常粗糙。对于任何严重的事情,请考虑使用pcre

© www.soinside.com 2019 - 2024. All rights reserved.