gpt4 book ai didi

c - posix 扩展正则表达式 : (()|abc)xyz 的预期行为

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:35 25 4
gpt4 key购买 nike

在我的 OS X 10.5.8 机器上,使用 regcomp 和 regexec C 函数来匹配扩展正则表达式“(()|abc)xyz”,我找到了字符串“abcxyz”的匹配项,但仅从偏移量 3 到偏移量 6。我的期望是整个字符串都匹配,并且我会看到字符串的初始“abc”部分的子匹配。

当我在同一台机器上使用 awk 尝试相同的模式和文本时,它显示了与我预期的整个字符串的匹配。

我希望我在正则表达式方面的有限经验可能是问题所在。有人可以解释发生了什么吗?我的正则表达式有效吗?如果是,为什么它不匹配整个字符串?

我知道“((abc){0,1})xyz”可以用作替代方案,但感兴趣的模式是从另一种模式格式自动生成的,消除“()”的实例是额外的工作如果可能的话,我想避免。

作为引用,我传递给 regcomp 的标志仅包含 REG_EXTENDED。我将一组空的标志 (0) 传递给 regexec。

最佳答案

POSIX标准说:

9.4.3 ERE Special Characters

An ERE special character has special properties in certain contexts. Outside those contexts, or when preceded by a <backslash>, such a character shall be an ERE that matches the special character itself. The extended regular expression special characters and the contexts in which they shall have their special meaning are as follows:

.[\(

The <period>, <left-square-bracket>, <backslash>, and <left-parenthesis> shall be special except when used in a bracket expression (see RE Bracket Expression ). Outside a bracket expression, a <left-parenthesis> immediately followed by a <right-parenthesis> produces undefined results.

您看到的是调用未定义行为的结果 - 一切皆有可能。

如果您想要可靠、可移植的结果,则必须消除空的 '() ' 符号。

关于c - posix 扩展正则表达式 : (()|abc)xyz 的预期行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1436194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com