我正在尝试为字符串创建一个验证器,它可能包含1-N个单词,用1个空格分隔(单词之间只有空格)。我是一个正则表达式的新手,所以我感到有点困惑,因为我的表达似乎是正确的:
^[[a-zA-Z]+\s{1}]{0,}[a-zA-Z]+$
我在这里做错了什么? (它只接受2个单词..但我希望它接受1个以上的单词) 非常感谢任何帮助:)
答案 0 :(得分:2)
正如有人开始使用新的编程语言或语法一样,你很接近,但并不完全!正确使用了^
和$
个锚点,而字符类[a-zA-Z]
只会匹配字母(对我来说是正确的),但是你的重复有点过了,你的分组是不是你认为的 - 这是你的主要问题。
^[[a-zA-Z]+\s{1}]{0,}[a-zA-Z]+$
^ ^^^^^^^^
a bbbacccc
它只匹配两个单词,因为你实际上没有任何组重复;这是因为你没有任何组 - 只有字符类。最简单的解决方法是将第一个[
及其匹配的结束括号(在上面的清单中标记为a
)更改为括号:
^([a-zA-Z]+\s{1}){0,}[a-zA-Z]+$
此单一更改将使其按预期方式工作!但是,我想提出一些建议和考虑因素。
首先,为了便于阅读和维护代码,请尽可能使用单字符重复运算符而不是重复括号。 *
重复零次或多次,+
重复一次或多次,?
重复0次或一次(AKA 可选)。你的重复花括号在语法上是正确的,并做你想要的,但是一个(上面用b
标记)应该被删除,因为它是多余的,另一个(用c
标记' s)应缩短为星号*
,因为它们具有完全相同的含义:
^([a-zA-Z]+\s)*[a-zA-z]+$
其次,我建议考虑(取决于您的应用程序要求)\w
速记字符类而不是[a-zA-Z]
字符类,并考虑以下因素:
如果其中任何一项不必要或不受欢迎,那么你就走在正确的轨道上了!
在旁注中,字符组合\b
是一个单词边界断言,不需要你的情况,因为你已经开始和结束只有字母和字母的地方!
至于更多关于正则表达式的学习,我建议Regular-Expressions.info,它有关于正则表达式的丰富信息以及各种实现的内部工作和怪癖。我还使用一个名为RegexBuddy的工具来测试和调试表达式。