正则表达式匹配a-z空格,字符限制,只有首字母大写

时间:2013-07-06 00:06:54

标签: php regex

我需要一些正则表达式的帮助。我很可怕。

规则:

  • 仅字母a到z和空格
  • 最少2个字母
  • 最多30个字母
  • 每个单词必须至少为2个字母
  • 只有每个单词的第一个字母可以为大写,但第一个字母必须始终为大写

我的尝试:

^[A-Z][a-z]{2,30}$

我在PHP中使用它。

2 个答案:

答案 0 :(得分:3)

好的,让我们先尝试解决1到3的要求。如果你的意思是2到30个字符,它就像这样简单:

^[a-zA-Z ]{2,30}$

现在有其他要求。让我们独自处理。第4点要求每个单词的格式为[a-zA-Z][a-z]*。为确保每个单词至少包含两个字母,我们只需将*转换为+(表示重复1次或多次)即可。如果我们在这些周围插入显式空格,那么确保[a-z]+不能直接跟大写字母:

^[A-Z][a-z]+(?:[ ]+[a-zA-Z][a-z]+)*$

请注意,我单独处理了第一个单词。

最后,我们如何将两者结合起来?将一个放入lookahead。我打算在这里计算:

^(?=[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

这样可以更容易根据违反的条件提供合理的错误消息。

答案 1 :(得分:2)

我们试试这个:

^[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(而不是ereg_*)才能使用lookbehind。

"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