我有一个 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\\\\-#_]+$"
),它产生了相同的结果。 我知道我可以将破折号放在字符组的末尾而不转义,但我想知道如果它位于字符组的中间如何正确转义。
根据我能找到的所有文档,在 posix 扩展正则表达式中,您应该能够在字符组中转义 - ......
这是不正确的。来自 POSIX 9.3.5 RE 括号表达式...
特殊字符“.”、“*”、“[”和“\”(分别为 、 、 和 )在方括号表达式中将失去其特殊含义。
我知道我可以将破折号放在字符组的末尾而不转义,但我想知道如果它位于字符组的中间如何正确转义。
没有。您必须使用解析规则,如下所述。
如果该字符出现在列表中的第一个(在初始“^”之后,如果有)或最后一个,或者作为范围表达式中的结束范围点,则该字符应被视为自身。例如,表达式“[-ac]”和“[ac-]”是等效的,并且匹配任何字符“a”、“c”或“-”; “[^-ac]”和“[^ac-]”是等价的,匹配除“a”、“c”或“-”之外的任何字符;表达式“[%--]”匹配“%”和“-”之间的任何字符(包括“%”和“-”);表达式“[--@]”匹配“-”和“@”之间的任何字符(包括“-”和“@”);并且表达式“[a--@]”无效或等同于“@”,因为在 POSIX 语言环境中字母“a”位于符号“-”之后。要使用 a 作为起始范围点,它应位于括号表达式的第一位或指定为整理符号;例如,“[][.-.]-0]”,它匹配一个或任何在 0 和 0 之间进行排序的字符或排序元素。
如果括号表达式同时指定“-”和“]”,则在括号表达式中,“]”应放在前面(在“^”之后,如果有),“-”放在最后。
真是一场噩梦。最简单的方法就是将破折号放在前面或后面。
POSIX 正则表达式非常粗糙。对于任何严重的事情,请考虑使用pcre。