首页 > 解决方案 > C 中的正则表达式来限制扩展的 ASCII 字符集

问题描述

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

链接到扩展 ASCII 字符集表

标签: cregexposixextended-ascii

解决方案


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

所以如果你想从\x01to中排除字符\x20,你会写:

 "^[^\x01-\x20]+$"

请注意,您必须提供REG_EXTENDED标志才能regcomp使其正常工作。

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

"^[\x21-\xFF]+$"

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

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


推荐阅读