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


Easiest validation regular expression not matching space at beginning or end

我试图找到最简单的验证正则表达式(PCRE)用于方法preg_match()在PHP中。我想让它尽可能简单,尽可能避免重复。

我的匹配条件是:

  • 允许以下列表中的一个或多个字符(这意味着字符串应该是1个字符以上):

    a-zA-Z0-9 +&-
    
  • 开头和结尾不允许有空格

我的正则表达式知识可能缺乏,但是没有第二个空格条件我想到的是:

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

为了不匹配空格,我在考虑像

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

但是实际的片段需要3个以上的字符。

如果我这样做

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

它也不会一直工作,我想这与中间部分的"贪婪"有关,但我真的在努力研究如何在不成功的情况下把它做好。

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

您希望将两个[^ ]条件包装到断言中。左下角是(?=)(?<=)

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

我认为如果你在每端只测试一个非空格字符就足够了。那么它已经确保内容以字母或其他允许的字符开头。

似乎你不想只给一个模式,所以我将尝试给一些指针代替。

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

为了使模式尽可能短,您可以记住 * 从0到无限次匹配,这意味着无论您放在它前面的是什么,实际上都不必出现在那里;模式(ab*)+可以匹配abababaaa,但不能匹配ba

您的主要字符类包括一个空格字符,所以即使您显式地排除[^ ]*部分的空格,您仍然允许您的主要[a-z...]部分的空格,所以您已经有效地否定了regex的整个目的。

基本上,你已经竖起了一个禁止停车的标志,上面写着"随时禁止停车"。9-5英寸允许停车


followup:你想要的是否定的断言:

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

第一个是一个否定的(!)后看(<)断言,它说"不允许在后面的([a-z...])之前有空格('s)"。另一个是相同的,但是一个负面的前瞻性(>)。

我会把重点放在想要的东西上。

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