我想编写一个正则表达式模式,它以类名开头,类名之间有一个点,每个类名都以一个类名结尾,以一个字母开头。它就像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”
我想编写一个正则表达式模式,它以类名开头,类名之间有一个点,每个类名都以一个类名结尾,以一个字母开头。它就像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”
仅以下内容有什么问题:
^([a-zA-Z][a-zA-Z0-9_]*\.?)+$
只要有一个,它就会将类名与其中任意数量的包匹配。如果您至少需要两个实例,则以下内容也可以正常工作:
^([a-zA-Z]+)\.([a-zA-Z][a-zA-Z0-9_]*\.?){1,}$
首先,简化:
[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*)*$