什么是更好的方式来编写一个模式来验证这个字符串?
问题描述:
我想写一个类名开始,一直点类名之间以及与类名 每个类名结束,开始以letter.it就像Java类的进口正则表达式模式,什么是更好的方式来编写一个模式来验证这个字符串?
我写这个模式,但它太复杂和缓慢的验证,我认为它不能正常工作
^([a-zA-Z]([0-9]|_|[a-zA-Z])*)(([a-zA-Z]([0-9]|_|[a-zA-Z])*)|\\.)*([a-zA-Z]([0-9]|_|[a-zA-Z])*)$
例如我的输入字符串应该是这样的:“com.casp.common.StringUtils”
答
首先,简化:
[0-9]|_|[a-zA-Z]
可以组合为
[0-9_a-zA-Z]
,实际上它有一个速记代表
\w
让你的正则表达式可以先简化这个等价形式:
^([a-zA-Z](\w)*)(([a-zA-Z](\w)*)|\.)*([a-zA-Z](\w)*)$
现在,我们可以进一步通过去除一些多余的捕捉组简化,并打开不区分大小写匹配:
^[a-z]\w*([a-z]\w*|\.)*[a-z]\w*$
当然,这个正则表达式是不正确的,例如匹配a....b
。
问题是因为\.
是一个“替代”,它不应该是,因为每个组件之间的点需要需要。因此,它可能应该转化为:
^[a-z]\w*([a-z]\w*\.)*[a-z]\w*$
但它仍然是不正确,因为它不会匹配a.b
,因为前沿部分。我们需要将其删除:
^([a-z]\w*\.)*[a-z]\w*$
,并可能重新安排它使得重复的部分是在年底,而不是开始:
^[a-z]\w*(\.[a-z]\w*)*$
感谢Kenny,([a-zA-Z](\ w)*)(([a-zA-Z](\ w)*)| \。)*([a-zA-Z](\ w )*)$ 它匹配ab,并且不匹配ab – Pooya 2012-07-08 08:12:18