我需要一个C中的正则表达式,它能够匹配除长度大于0的扩展ASCII的前32个字符之外的所有字符。我认为最简单的方法是像"^[^\x00-\x20]+$"
这样的模式,但它并没有像我预期的那样工作。出于某种原因,它不会匹配48到92之间的任何字符。有什么想法吗?这个模式出了什么问题,我该如何修复?
链接到扩展ASCII字符集表
Posix正则表达式库(即regex.h
中的函数,包括regcomp
和regexec
(不解释标准的C反斜杠序列。它真的不需要,因为C会在编译字符串文字时进行这些扩展。(如果您从用户输入中接受正则表达式,则必须考虑这一点。(正则表达式中的唯一用途是转义特殊字符(在
REG_EXTENDED
模式下(,或使字符特殊(在基本正则表达式模式下,应避免使用(
因此,如果你想排除x01
到x20
中的字符,你可以写:
"^[^x01-x20]+$"
请注意,必须将REG_EXTENDED
标志提供给regcomp
才能工作。
正如您可能注意到的,这并不排除NUL(x00
(。没有办法在正则表达式模式中插入NUL,因为NUL不是C字符串中的有效字符;它将终止字符串。出于同样的原因,试图从C字符串中排除NUL字符是没有意义的,因为不可能有NUL字符。然而,如果它让你感觉更好,你可以使用:
"^[x21-xFF]+$"
从语义上讲,这两种正则表达式模式是相同的(至少在默认的"C"语言环境中,假设char
是8位(。
您编写的字符类[^\x00-\x20]
包含除字符x
和从0
(48(到(92(的范围之外的所有内容。(该范围与显式命名的字符
0
、2
和重叠,其中一些字符有两次。(
从未在C
中使用regex。我下一步会使用unsigned char
来安装EASCII
void match(const unsigned char *src, unsigned char *dst) {
while (*src) {
if (*src >= 32) {
*dst++ = *src++;
} else {
src++;
}
}
*dst = 0;
}