在C中使用Regex来限制扩展ASCII字符集



我需要一个C中的正则表达式,它能够匹配除长度大于0的扩展ASCII的前32个字符之外的所有字符。我认为最简单的方法是像"^[^\x00-\x20]+$"这样的模式,但它并没有像我预期的那样工作。出于某种原因,它不会匹配48到92之间的任何字符。有什么想法吗?这个模式出了什么问题,我该如何修复?

链接到扩展ASCII字符集表

Posix正则表达式库(即regex.h中的函数,包括regcompregexec(不解释标准的C反斜杠序列。它真的不需要,因为C会在编译字符串文字时进行这些扩展。(如果您从用户输入中接受正则表达式,则必须考虑这一点。(正则表达式中的唯一用途是转义特殊字符(在REG_EXTENDED模式下(,或使字符特殊(在基本正则表达式模式下,应避免使用(

因此,如果你想排除x01x20中的字符,你可以写:

"^[^x01-x20]+$"

请注意,必须将REG_EXTENDED标志提供给regcomp才能工作。

正如您可能注意到的,这并不排除NUL(x00(。没有办法在正则表达式模式中插入NUL,因为NUL不是C字符串中的有效字符;它将终止字符串。出于同样的原因,试图从C字符串中排除NUL字符是没有意义的,因为不可能有NUL字符。然而,如果它让你感觉更好,你可以使用:

"^[x21-xFF]+$"

从语义上讲,这两种正则表达式模式是相同的(至少在默认的"C"语言环境中,假设char是8位(。

您编写的字符类[^\x00-\x20]包含除字符x和从0(48(到(92(的范围之外的所有内容。(该范围与显式命名的字符02重叠,其中一些字符有两次。(

从未在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;
}

相关内容

  • 没有找到相关文章

最新更新