最简单的验证正则表达式在开头或结尾不匹配空格

时间:2011-10-17 14:10:13

标签: php regex preg-match

我正在尝试找到最简单的验证正则表达式(PCRE),以便在PHP中的方法preg_match()中使用。我希望尽可能简单,尽可能避免重复。

我在单词中的匹配标准是:

  • 从以下列表中允许一个或多个字符(这意味着字符串应为1个字符,总计最多):

    a-zA-Z0-9 +&-
    
  • 不要在开头或结尾留空间

我的正则表达知识可能缺乏,但我提出的没有第二个空间标准的是:

    /^[a-zA-Z0-9 +&-]+$/

为了与空间不匹配,我正在考虑像

这样的东西
    /^[^ ]+[a-zA-Z0-9 +&-]+[^ ]+$/

但是这个实际的部分需要3个以上的字符。

如果我这样做

    /^[^ ]*[a-zA-Z0-9 +&-]+[^ ]*$/

它也不会在任何时候都有效,我想它与中间部分的“贪婪”有关,但我真的试图研究如何在没有成功的情况下做到正确。

感谢任何建议或指针正确方向!

4 个答案:

答案 0 :(得分:2)

您希望将两个[^ ]条件都包含在断言中。最后左手(?=)(?<=)

 /^(?=[^ ])[a-zA-Z0-9 +&-]+(?<=\S)$/

我认为只要在每一端测试一个非空格字符就足够了。然后,已经确保内容以字母或其他允许的字符开头。

请参阅http://www.regular-expressions.info/lookaround.html以获得更好的解释。

答案 1 :(得分:0)

你的主角色类包含一个空格字符,所以即使你明确地用[^ ]*部分排除空格,你仍然允许你的主[a-z...]空格,所以你有效地否定了整个目的正则表达式。

基本上,你已经设置了一个禁止停车的标志,上面写着“随时停车。停车允许9-5”。


跟进:你想要的是否定主张:

/^(?<!\s)[a-z.....](?>!\s)$/

第一个是负面(!)后瞻(<)断言,表示“在随后的任何内容之前不允许空格(\s){{1}另一个是相同的,但是是否定前瞻([a-z...])。

答案 2 :(得分:0)

似乎你不想只给出一个模式,所以我会尝试给出一些指示。

您希望匹配以列表[a-zA-Z0-9+&-]中的任何字符开头的字符串,您希望它跟随同一列表或空格中的任何字符,且长度不限。

为了使模式尽可能短,你可以记住 * 匹配从0到无限次,这意味着你放在它前面的任何东西实际上根本不必出现在那里;模式(ab*)+可以匹配abababaaa,但绝不匹配ba

答案 3 :(得分:0)

我会把注意力放在想要的东西上。

^(?i)[a-z0-9+&-][a-z0-9 +&-]*(?<=[a-z0-9+&-])$