我需要一些正则表达式的帮助。我在这很糟糕。正则表达式匹配a-z空格,字符数限制,只有第一个字母大写
规则:
- 只有字母A到Z和空格
- 最少2个字母
- 最多30个字母
- 每个字都必须至少有2个字母
- 只的第一个字母每个字可能是大写,但第一个字母必须是总是必须是大写
我尝试:
^[A-Z][a-z]{2,30}$
我在PHP中使用此。
我需要一些正则表达式的帮助。我在这很糟糕。正则表达式匹配a-z空格,字符数限制,只有第一个字母大写
规则:
我尝试:
^[A-Z][a-z]{2,30}$
我在PHP中使用此。
好的,我们先试着解决要求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
这使得它更容易得到,这取决于条件是违反有意义的错误消息。
惊人的简单的惊人。你知道你的正则表达式。非常感谢!真的 – PopeyeDoyle
@PopeyeDoyle :)在我的第一个评论中关于你的问题链接了教程。到周末结束时,你会自己想出这样的模式。 –
我要补充我的咖啡杯,现在有一个阅读:) – PopeyeDoyle
让我们试试这个:
^[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。
30需要是29,否则你会允许31个字符的字符串。 – nickb
你可以修改你的两个字母的要求:'^ [AZ] [az]((?<= [])[AZ] | [az] | [](?= [A-Za-z] {2} )){2,29} $'或者沿着这些线的东西;) –
那么,在这一点上我不认为使用正则表达式是明智的。我会与'^ [A-Z] [a-z] +([A-Za-z] [a-z] +)* $'匹配并分别检查长度。 –
[这应该让你开始。](http://www.regular-expressions.info/tutorial.html)但更重要的是:你使用这个正则表达式的语言/工具? –
前三条规则完全在正则表达式的能力范围内。但是,如果您试图对所有四条规则使用单个正则表达式,则第四条规则将被证明是一个挑战。 – nickb
@nickb第四个单独的问题也不是问题,正交要求可以与前瞻*如果味道提供它们相结合。因此,我的问题为OP –