我需要一些关于正则表达式的帮助。这点我很糟糕。
规则:
- 只有字母 a 到 z 和空格
- 最少 2 个字母
- 最多 30 个字母
- 每个单词必须至少有 2 个字母
- 只有每个单词的第一个字母可以大写,但第一个字母必须始终是大写
我的尝试:
^[A-Z][a-z]{2,30}$
我在 PHP 中使用它。
好的,让我们先尝试解决需求 1 到 3。如果您的意思是 2 到 30 个字符,就这么简单:
^[a-zA-Z ]{2,30}$
现在是其他要求。让我们独自处理这些。第 4 点要求每个单词的格式为[a-zA-Z][a-z]*
。为了确保每个单词至少有两个字母,我们可以简单地将 the*
变成 a +
(表示 1 次或多次重复)。如果我们在这些周围插入显式空格,则可以确保[a-z]+
不能直接跟大写字母:
^[A-Z][a-z]+(?:[ ]+[a-zA-Z][a-z]+)*$
请注意,我分别处理了第一个单词。
最后,我们如何将两者结合起来?通过将一个放入前瞻中。我要在这里数数:
^(?=[a-zA-Z ]{2,30}$)[A-Z][a-z]+(?:[ ]+[a-zA-Z][a-z]+)*$
这是有效的,因为在根据前瞻检查输入之后,引擎将其“光标”重置到它开始的位置(字符串的开头)并像往常一样继续匹配。这样我们可以在输入上运行两次,检查独立的条件。
最后,请注意,前瞻要求仅转换为字符串的长度。在这种情况下,单独检查会更容易(而且通常更好):
$len = strlen($input)
if ($len < 2 || $len > 30)
// report error about string length
else if (!preg_match('/^[A-Z][a-z]+(?:[ ]+[a-zA-Z][a-z]+)*$/', $input))
// report error about pattern
else
// process input
这使得根据违反的条件提供合理的错误消息变得更加容易。
让我们试试这个:
^[A-Z]((?<= )[A-Z]|[a-z ]){2,29}$
[A-Z] -- a capital letter
(
(?<= )[A-Z] -- either a capital letter preceded by a space
| -- or
[a-z ] -- a lowercase letter or a space
){2,29} -- 2 to 29 times (plus the initial capital)
您将需要使用 PCRE (not ereg_*
) 来进行后视工作。
"My name Is bob"
↑ ↑ ↑
| | \-- this is a "(?<= )[A-Z]"
| \--- this is a "[a-z]"
\---- this is a "[ ]"
"naMe"
↑
\-- this is NOT a "(?<= )[A-Z]" (a character before the [A-Z] is not a space)
编辑:该死的,您添加了“每个单词必须至少有 2 个字母”。使用m.buettner
's。