我正在尝试找到最简单的验证正则表达式(PCRE),以便在PHP中的方法preg_match()中使用。我希望尽可能简单,尽可能避免重复。
我在单词中的匹配标准是:
从以下列表中允许一个或多个字符(这意味着字符串应为1个字符,总计最多):
a-zA-Z0-9 +&-
我的正则表达知识可能缺乏,但我提出的没有第二个空间标准的是:
/^[a-zA-Z0-9 +&-]+$/
为了与空间不匹配,我正在考虑像
这样的东西 /^[^ ]+[a-zA-Z0-9 +&-]+[^ ]+$/
但是这个实际的部分需要3个以上的字符。
如果我这样做
/^[^ ]*[a-zA-Z0-9 +&-]+[^ ]*$/
它也不会在任何时候都有效,我想它与中间部分的“贪婪”有关,但我真的试图研究如何在没有成功的情况下做到正确。
感谢任何建议或指针正确方向!
答案 0 :(得分:2)
您希望将两个[^ ]
条件都包含在断言中。最后左手(?=)
和(?<=)
。
/^(?=[^ ])[a-zA-Z0-9 +&-]+(?<=\S)$/
我认为只要在每一端测试一个非空格字符就足够了。然后,已经确保内容以字母或其他允许的字符开头。
请参阅http://www.regular-expressions.info/lookaround.html以获得更好的解释。
答案 1 :(得分:0)
你的主角色类包含一个空格字符,所以即使你明确地用[^ ]*
部分排除空格,你仍然允许你的主[a-z...]
空格,所以你有效地否定了整个目的正则表达式。
跟进:你想要的是否定主张:
/^(?<!\s)[a-z.....](?>!\s)$/
第一个是负面(!
)后瞻(<
)断言,表示“在随后的任何内容之前不允许空格(\s
){{1}另一个是相同的,但是是否定前瞻([a-z...]
)。
答案 2 :(得分:0)
似乎你不想只给出一个模式,所以我会尝试给出一些指示。
您希望匹配以列表[a-zA-Z0-9+&-]
中的任何字符开头的字符串,您希望它跟随同一列表或空格中的任何字符,且长度不限。
为了使模式尽可能短,你可以记住 *
匹配从0到无限次,这意味着你放在它前面的任何东西实际上根本不必出现在那里;模式(ab*)+
可以匹配ab
或abab
或aaa
,但绝不匹配ba
答案 3 :(得分:0)
我会把注意力放在想要的东西上。
^(?i)[a-z0-9+&-][a-z0-9 +&-]*(?<=[a-z0-9+&-])$