c - C 中的正则表达式来限制扩展的 ASCII 字符集
问题描述
我需要 C 中的正则表达式能够匹配所有内容,但长度大于 0 的扩展 ASCII 中的前 32 个字符除外。我认为最简单的方法是类似模式"^[^\\x00-\\x20]+$"
,但它没有按我预期的那样工作。出于某种原因,它不会匹配从 48 到 92 的任何字符。任何想法这种模式有什么问题,我该如何解决?
解决方案
Posix 正则表达式库(即 中的函数regex.h
,包括regcomp
和regexec
)不解释标准 C 反斜杠序列。它真的不需要,因为当你编译字符串文字时,C 会做这些扩展。(如果您接受来自用户输入的正则表达式,这是您必须考虑的事情。)\
在正则表达式中的唯一用途是转义特殊字符(在REG_EXTENDED
模式中),或使字符特殊(在基本正则表达式模式中,这应该避免。)
所以如果你想从\x01
to中排除字符\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
\
推荐阅读
- python - Get the text from parent element only (without text from children elements) using Selenium in Python?
- symfony - 表单被刷新,而不是在 EasyAdmin (Symfony) 中返回错误
- python - Python - 从 yaml 获取所有 url
- visual-studio-code - VSCode 在启动时冻结
- google-bigquery - BigQuery REGEXP_REPLACE 在替换表达式中引用捕获组
- excel - 有没有办法在 Power BI 的“折线和聚集柱形图”中使用我的左 Y 轴包含趋势线?
- arrays - 我正在使用 for 循环添加两个数组。只有我的第二个数组的第一个元素被添加到第一个数组的所有元素中。For循环没有迭代
- database - 无法使用 Robo3T 连接到 Mongo 副本集
- python - 在python中将任何类型更改为字节
- html - 仪表板网格替代方案