gpt4 book ai didi

php - 为什么这个正则表达式在 PHP 中不以相同的方式验证?

转载 作者:行者123 更新时间:2023-12-04 15:32:08 24 4
gpt4 key购买 nike

当我尝试使用以下表达式进行 preg_match 时:/.{0,5}/,它仍然匹配长度超过 5 个字符的字符串。但是,在 online regexp matcher 中尝试时它确实可以正常工作

最佳答案

您提到的网站 myregexp.com 专注于 Java。

Java 有一个特定的函数来匹配一个精确的模式,而不需要使用 anchor 字符。这是 myregexp.com 使用的函数。

在大多数其他语言中,为了匹配精确的模式,您需要分别在模式的开头和结尾添加锚定字符 ^$ , 否则正则表达式假定它只需要在字符串中的某处找到匹配的模式,而不是匹配整个字符串。

这意味着如果没有 anchor ,您的模式将匹配任何长度的任何字符串,因为无论是什么字符串,它都会在其中某处包含“任何字符的零到五个”的匹配项。

所以在 PHP、Perl 和几乎任何其他语言中,您需要您的模式看起来像这样:

/^.{0,5}$/

在解释了所有这些之后,我还要得出一个最后的结论:这个特定的模式实际上不需要是一个正则表达式——您可以使用 strlen() 来实现相同的目的。此外,正则表达式中的点字符可能不会完全按照您的预期工作:它通常匹配几乎任何字符;默认情况下,某些字符(包括换行符)被排除在外,因此如果您的字符串包含五个字符,但其中一个是换行符,那么当您可能期望它通过时,它会使您的正则表达式失败。考虑到这一点,strlen() 将是一个更安全的选择(如果您希望使用 unicode 字符,则选择 mb_strlen())。

如果您需要匹配正则表达式中的任何字符,而点的默认行为不够好,有两种选择:一种是添加 表达式末尾的修饰符(即变为 /^.{0,5}$/s)。 s 修饰符告诉正则表达式在点“任何字符”匹配中包含换行符。

另一个选项(对于不支持 s 修饰符的语言很有用)是在字符类中一起使用表达式及其否定 - 例如 [\s\S] - 而不是点。 \s 匹配任何空白字符,而 \S\s 的负数,所以任何与 \s 不匹配的字符。因此,在一个字符类中,它们可以匹配任何字符。它比点更冗长且可读性更差,但在某些语言中这是唯一可以确定的方法。

您可以在这里找到更多相关信息:http://www.regular-expressions.info/dot.html

希望对您有所帮助。

关于php - 为什么这个正则表达式在 PHP 中不以相同的方式验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6802813/

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