据我所知,正则表达式模式必须匹配以组合开头并重复以下字符的字符串:
a-z
A-Z
a white-space character
字符串的结束方式没有限制!
所以uoiui897868
之类的字符串(任何只以空格开头的字符串,a-z
或A-Z
)都匹配模式......(当然可以)
但问题是像76868678jugghjiuh
这样的字符串(任何只以空格以外的字符开头的字符串,a-z
或A-Z
)也匹配! 这不应该发生!
我也检查过使用php函数preg_match()
,它返回true(即模式匹配字符串)。
还使用了其他在线工具,例如regex101
或regexr.com
。字符串与模式匹配。
任何人都可以帮我理解为什么模式匹配第二种情况中描述的字符串?
答案 0 :(得分:5)
/^[a-zA-Z ]*/
你的正则表达式将匹配"以"开头的字符串。 任何数字(包括零)的字母或空格。
^
表示"字符串的开头" *
表示"零或更多"。
uoiui897868
和76868678jugghjiuh
都以0或更多字母/空格开头,因此它们都匹配。
你可能想要:
/^[a-zA-Z ]+/
+
表示"一个或多个",因此它不会匹配零个字符。
答案 1 :(得分:5)
你的正则表达式是完全无用的:它将与任何字符串(空的,非空的,带数字,没有,......)轻而易举地匹配,无论其结构如何。
这是因为
^
,强制执行字符串的开头,现在每个字符串都有一个开头。[A-Za-z ]
,但您使用*
运算符,因此0
或更多重复。因此,即使字符串不包含(或以[A-Za-z ]
开头的字符,匹配器也会简单地说:零匹配并解析剩余的字符串。您需要使用+
代替*
强制执行 “至少一个字符”。
答案 2 :(得分:4)
您真正想要的是匹配一个或更多前面的字符。
为此你使用+
/^[a-zA-Z ]+/
答案 3 :(得分:2)
末尾的'*'量词表示该字符的零个或多个匹配,因此所有字符串都匹配。也许您想要删除通配符量词,或将其更改为'+'量词,并在末尾添加'$'来测试整个字符串。