gpt4 book ai didi

PHP 正则表达式 - 使用元字符作为分隔符

转载 作者:搜寻专家 更新时间:2023-10-31 20:39:47 28 4
gpt4 key购买 nike

所以我一直在阅读 php (PCRE) 正则表达式 doco,并且我注意到有关分隔符 (http://php.net/manual/en/regexp.reference.delimiters.php) 的部分说:

“分隔符可以是任何非字母数字、非反斜杠、非空白字符。”

它还讨论了使用括号作为分隔符:

“方括号样式分隔符在模式中用作元字符时不需要转义,但与其他分隔符一样,它们在用作文字字符时必须转义。”

我的问题是,如何使用其他正则表达式元字符作为分隔符,以及将它们用作模式中的元字符?

根据我所做的测试,不可能使用元字符,例如“|”作为模式中的定界符和元字符。我想不出为什么需要这样做的任何理由,但我很好奇“正确”的答案是什么。

最佳答案

显然,选择一个在模式中具有特殊含义的定界符可能会导致令人头疼的问题,而这应该很容易避免。所以当然不要这样做。

但是为了满足您的好奇心,看来您的观察是正确的,如果将字符用作分隔符,则无法保留字符的特殊含义。让我们浏览一下相关的PHP source for PCRE functions看看为什么。 (为简单起见,此处省略了一些代码。)

首先,它会跳过它遇到的任何前导空格。

while (isspace((int)*(unsigned char *)p)) p++;

之后,分隔符被选为字符串中的第一个字符。

delimiter = *p++;

接下来,确定 end_delimiter 是与 start_delimiter 相同的字符还是左括号字符的补码(即, ) 补充 (, ] 补充 [ 等)。回想一下手册是如何明确指出以这种方式特殊处理括号式字符的。

start_delimiter = delimiter;
if ((pp = strchr("([{< )]}> )]}>", delimiter)))
delimiter = pp[5];
end_delimiter = delimiter;

pp = p;

如果定界符不是互补括号——相反,两个字符相同——结束定界符被确定为第一个未转义的匹配字符。

while (*pp != 0) {
if (*pp == '\\' && pp[1] != 0) pp++;
else if (*pp == delimiter)
break;
pp++;
}

一切都非常简单,但是一旦找到分隔符,包含的 pattern 就被确定为两个分隔符之间的逐字字符串。

pattern = estrndup(p, pp-p);

因此,您最初在模式中转义的任何字符仍将作为转义字符传输到底层 PCRE 函数中的模式解析器本身。

re = pcre_compile(pattern, ...

此时,无论您选择了哪个分隔符,孤立的模式都是相同的。实际的正则表达式引擎完全不理会您的选择。

我希望这就是您要问的。 :-)

关于PHP 正则表达式 - 使用元字符作为分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25396755/

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