解释正则表达式 /^[a-zA-Z ]*/

Explain the Regular Expression /^[a-zA-Z ]*/

我了解正则表达式模式必须匹配以以下字符的组合和重复开头的字符串:

  1. a-z
  2. A-Z
  3. a white-space character

并且对字符串的结尾方式没有限制!


第一个案例

所以像 uoiui897868 这样的字符串(任何仅以空格、a-zA-Z 开头的字符串)与模式匹配...(确实如此)

第二种情况

但问题是像 76868678jugghjiuh 这样的字符串(任何仅以空格以外的字符开头的字符串,a-zA-Z)也匹配! 这不应该发生!


我也使用 php 函数 preg_match() 进行了检查,returns 为真(即模式与字符串匹配)。 还使用了其他在线工具,例如 regex101regexr.com。该字符串与模式匹配。 谁能帮我理解为什么模式与第二种情况中描述的字符串匹配?

末尾的“*”量词表示该字符有零个或多个匹配项,因此所有字符串都匹配。也许您想删除通配符量词,或将其更改为“+”量词,并在末尾添加“$”以测试整个字符串。

/^[a-zA-Z ]*/

您的正则表达式将匹配 "begin with" 任何 个(包括零个)字母或空格的字符串。

^ 表示 "start of string",* 表示 "zero or more"。

uoiui89786876868678jugghjiuh 都以 0 个或多个 letters/spaces 开头,所以它们都匹配。

你可能想要:

/^[a-zA-Z ]+/

+表示"one or more",所以它不会匹配零个字符。

您真正想要的是匹配 一个 或多个前面的字符。

为此你使用 +

/^[a-zA-Z ]+/

你的正则表达式完全没用:它会简单地匹配任何字符串(空的,非空的,有数字的,没有,...),不管它的结构。

这是因为

  • 使用 ^,您强制字符串的开头,现在每个字符串都有一个开头。
  • 您使用了一个组 [A-Za-z ],但您使用了一个 * 运算符,因此 0 或更多重复。因此,即使字符串不包含(或以)来自 [A-Za-z ] 的字符,匹配器也会简单地说:零匹配并解析字符串的剩余部分。

您需要使用 + 而不是 * 强制执行 "at least one character".