编写用于验证此字符串的模式的更好方法是什么?

时间:2012-07-08 07:49:50

标签: regex

我想编写一个以类名开头的正则表达式模式,并在类名之间加上点,并以类名结束 每个类名,以letter开头。就像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”

2 个答案:

答案 0 :(得分:2)

以下内容有什么问题:

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

只要有类名,它就会将类名与其中的任意数量的包匹配。如果您需要至少两个实例,以下内容也可以正常工作:

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

答案 1 :(得分:2)

首先,简化:

[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*)*$