2

我想编写一个正则表达式模式,它以类名开头,类名之间有一个点,每个类名都以一个类名结尾,以一个字母开头。它就像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”

4

2 回答 2

2

仅以下内容有什么问题:

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

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

^([a-zA-Z]+)\.([a-zA-Z][a-zA-Z0-9_]*\.?){1,}$
于 2012-07-08T07:55:02.233 回答
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*)*$
于 2012-07-08T08:00:02.000 回答