2013-07-06 117 views
1

我需要一些正则表达式的帮助。我在这很糟糕。正则表达式匹配a-z空格,字符数限制,只有第一个字母大写

规则:

  • 只有字母A到Z和空格
  • 最少2个字母
  • 最多30个字母
  • 每个字都必须至少有2个字母
  • 只的第一个字母每个字可能是大写,但第一个字母必须是总是必须是大写

我尝试:

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

我在PHP中使用此。

+0

[这应该让你开始。](http://www.regular-expressions.info/tutorial.html)但更重要的是:你使用这个正则表达式的语言/工具? –

+0

前三条规则完全在正则表达式的能力范围内。但是,如果您试图对所有四条规则使用单个正则表达式,则第四条规则将被证明是一个挑战。 – nickb

+0

@nickb第四个单独的问题也不是问题,正交要求可以与前瞻*如果味道提供它们相结合。因此,我的问题为OP –

回答

3

好的,我们先试着解决要求1到3。如果你的意思是2至30 字符这是如此简单:

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

现在的其他要求。让我们单独处理这些问题。要点4要求每个单词的形式为[a-zA-Z][a-z]*。为了确保每个单词至少有两个字母,我们可以简单地将*变成+(意味着一个或多个重复)。如果我们插入围绕这些明确的空间,这可以确保[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 

这使得它更容易得到,这取决于条件是违反有意义的错误消息。

+0

惊人的简单的惊人。你知道你的正则表达式。非常感谢!真的 – PopeyeDoyle

+0

@PopeyeDoyle :)在我的第一个评论中关于你的问题链接了教程。到周末结束时,你会自己想出这样的模式。 –

+0

我要补充我的咖啡杯,现在有一个阅读:) – PopeyeDoyle

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_*)的回顾后工作。

"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。

+0

30需要是29,否则你会允许31个字符的字符串。 – nickb

+0

你可以修改你的两个字母的要求:'^ [AZ] [az]((?<= [])[AZ] | [az] | [](?= [A-Za-z] {2} )){2,29} $'或者沿着这些线的东西;) –

+1

那么,在这一点上我不认为使用正则表达式是明智的。我会与'^ [A-Z] [a-z] +([A-Za-z] [a-z] +)* $'匹配并分别检查长度。 –

相关问题