当我使用以下表达式/.{0,5}/
尝试preg_match时,它仍匹配长度超过5个字符的字符串。
但是,在online regexp matcher
答案 0 :(得分:6)
您引用的网站myregexp.com专注于Java。
Java具有用于匹配精确模式的特定功能,而无需使用锚字符。这是myregexp.com使用的功能。
在大多数其他语言中,为了匹配精确的模式,您需要分别在模式的开头和结尾添加锚定字符^
和$
,否则正则表达式假定它只需在字符串中的某处找到匹配的模式,而不是匹配的整个字符串。
这意味着没有锚点,你的模式将匹配任何长度的任何字符串,因为无论字符串是什么,它都会在其中包含“零到五个任何字符”的匹配。
所以在PHP,Perl以及几乎任何其他语言中,你需要你的模式看起来像这样:
/^.{0,5}$/
在解释了所有这些之后,我会做一个最后的观察:这个特定模式真的不需要是正则表达式 - 你可以用strlen()
实现同样的目的。此外,正则表达式中的点字符可能无法完全按预期工作:它通常匹配几乎任何字符;默认情况下会排除某些字符(包括换行符),因此如果您的字符串包含五个字符,但其中一个字符是新行,那么当您可能希望它通过时,它将使您的正则表达式失败。考虑到这一点,strlen()
将是一个更安全的选项(如果您希望有unicode字符,则为mb_strlen()
。)
如果你需要匹配正则表达式中的任何字符,并且点的默认行为不够好,有两个选项:一个是添加s
修饰符at表达式的结尾(即它变为/^.{0,5}$/s
)。 s
修饰符告诉正则表达式在点“任意字符”匹配中包含换行符号。
另一个选项(对于不支持s
修饰符的语言很有用)是在字符类中使用表达式及其否定 - 例如[\s\S]
- 而不是点。 \s
匹配任何空白字符,\S
是\s
的否定字符,因此任何字符都不匹配\s
。所以在角色类中它们匹配任何角色。它比一个圆点更长,更不易读,但在某些语言中,它是唯一确定的方法。
您可以在此处找到有关此内容的更多信息:http://www.regular-expressions.info/dot.html
希望有所帮助。
答案 1 :(得分:4)
您需要使用^$
来锚定它。这些符号分别与字符串的开头和结尾匹配,因此在开头和结尾之间必须是0-5个字符。离开锚点将匹配字符串中的任何位置,因此它可能更长。
/^.{0,5}$/
为了更好的可读性,我可能还会将.
括在()
中,但这有点主观。
/^(.){0,5}$/