什么是更好的方式来编写一个模式来验证这个字符串?

问题描述:

我想写一个类名开始,一直点类名之间以及与类名 每个类名结束,开始以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*)*$ 
+1

感谢Kenny,([a-zA-Z](\ w)*)(([a-zA-Z](\ w)*)| \。)*([a-zA-Z](\ w )*)$ 它匹配ab,并且不匹配ab – Pooya 2012-07-08 08:12:18

什么是错的只是以下内容:

^([a-zA-Z][a-zA-Z0-9_]*\.?)+$ 

只要有一个,它就会将类名与任意数量的包匹配。如果你需要至少两个实例下面将正常工作,以及:

^([a-zA-Z]+)\.([a-zA-Z][a-zA-Z0-9_]*\.?){1,}$ 
+0

谢谢您的回答,但它的com.casp匹配。 common.StringUtils。 它以点号结尾 – Pooya 2012-07-08 08:04:01

+0

啊,它的确如此,并且提示为时已晚。 – sean 2012-07-08 08:13:16